Insertar imagen en base datos, en variable BLOB

Neyadel
02 de Diciembre del 2005
Hola a todos:

Antes de empezar voy a deciros lo que estoy utilizando:

Oracle9i
Jakarta-Tomcat-4.1.27
Java 2 Platform Std Ed. v1.4.1
JDBC-ODBC

A continuación, el problema que tengo. Vereis, quiero insertar una imagen en la base de datos, que tiene unos 46 kb, más o menos, sabiendo que en la base de datos, lo almaceno en una variable de tipo BLOB. Para ello, empleo la siguiente secuencia de instrucciones, haciendo una llamada a un procedimiento almacenado de la base de datos:

try
{
File fichero = new File ("c:imagen.jpg");
FileInputStream canal = new FileInputStream (fichero);
byte bytes [] = new byte [(int) fichero.length ()];
int leidos = canal.read (bytes);
String sql = "{call paquete.InsertarImagen (1, ?)}";
CallableStatement cstmt = conexion.prepareCall (sql);
cstmt.setBytes (1, bytes);
cstmt.execute ();
cstmt.close ();
canal.close ();
}
catch (Exception e)
{
// Recoger excepción
}

Para imágenes de tamaño inferior a esta, no he tenido ningún problema. Sin embargo, para imágenes de 46 kb o superiores, me sale el mensaje:

"Conversión ilógica o no implementada".

Lo más gracioso de todo, es que si puedo insertar esa imagen haciendo uso de PreparedStatement, pero desgraciadamente tengo que utilizar el procedimiento almacenado de la base de datos.

¿Alguien puede echarme un cable?

josel
02 de Diciembre del 2005
Hola, Yo creo que es por el tamaño del buffer de lectura del procedimiento almcenado, creo que el buffer de lectura es de 46 KB, no sé cómo pero busque cómo se puede leer bytes desde un procedimiento almacenado.

AndresCuenca
02 de Diciembre del 2005
que tal tengo el mismo problema si ya lo resolviste y me puedes enviar la solucion te agradeceria bastante gracias

Raul
02 de Diciembre del 2005
A mí me pasaba algo similar en SQL Server, revisa si [(int) fichero.length ()] no se está pasando del rango (int con signo, creo que hasta 35550 o algo así) no se bien el rango de los tipos en Java, pero es una pista.

Otra forma sería cargar el archivo por partes, pero no sé como se podría modificar el procedimiento almacenado para ello