图像存储在SQL服务器数据库使用java
问题描述:
我想保存图像在SQL服务器数据库使用过程。我有一个PROCEDURE名称与输入参数,但我没有过程语法。图像存储在SQL服务器数据库使用java
BufferedImage imm = ImageIO.read(new File("C:\\MY DATA\\Release 2\\18.jpg"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(imm, "jpg", baos);
baos.flush();
byte[] immAsBytes = baos.toByteArray();
baos.close();
con.setAutoCommit(true);
CallableStatement statement = con.prepareCall(query);
ByteArrayInputStream baisForIndex2 = new ByteArrayInputStream(immAsBytes);
ByteArrayInputStream baisForIndex3 = new ByteArrayInputStream(immAsBytes);
statement.setDate(1, sqlDate);
statement.setBinaryStream(2, baisForIndex2, immAsBytes.length);
statement.setBinaryStream(3, baisForIndex3, immAsBytes.length);
statement.executeUpdate();
错误信息:操作数类型冲突:nvarchar与图像不兼容。 SQLSTATE:S0002 错误代码:206 错误代码:0
我要的是与图像类型的SQL服务器的数据库兼容Java类型。
答
将数据流插入blob时,JDBC驱动程序将从中读取指定的长度,并且而不是在完成时重置该数据流。 在您的示例中,您将此流用于占位符2,然后再用于占位符3并每次指定基础字节[]的整个长度。这样,当驱动程序到达占位符3时,流被耗尽,无法读取。
一种解决方案可能是使用两个流对象:
CallableStatement statement = con.prepareCall(query);
ByteArrayInputStream baisForIndex2 = new ByteArrayInputStream(immAsBytes);
ByteArrayInputStream baisForIndex3 = new ByteArrayInputStream(immAsBytes);
statement.setDate(1, sqlDate);
statement.setBinaryStream(2, baisForIndex2, immAsBytes.length);
statement.setBinaryStream(3, baisForIndex3, immAsBytes.length);
statement.executeUpdate();
谢谢你,这个工作。但我仍然面临 - “错误消息:操作数类型冲突:nvarchar与图像SQLSTATE不兼容:S0002错误代码:206错误代码:0”问题。 – 2014-09-13 10:19:21
是基础表nvarchar而不是varbinary中的列数据类型?如果是这样,该列需要更改为varbinary。 – 2014-09-13 10:43:10
只有我有访问数据库,我无法看到数据库结构。 在这个DB coloumn类型是IMAGE.So什么是IMAGE在Java代码中的兼容类型。 – 2014-09-16 05:58:25