2014-09-13 64 views
2

我想保存图像在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类型。

回答

2

将数据流插入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(); 
+0

谢谢你,这个工作。但我仍然面临 - “错误消息:操作数类型冲突:nvarchar与图像SQLSTATE不兼容:S0002错误代码:206错误代码:0”问题。 – 2014-09-13 10:19:21

+0

是基础表nvarchar而不是varbinary中的列数据类型?如果是这样,该列需要更改为varbinary。 – 2014-09-13 10:43:10

+0

只有我有访问数据库,我无法看到数据库结构。 在这个DB coloumn类型是IMAGE.So什么是IMAGE在Java代码中的兼容类型。 – 2014-09-16 05:58:25

相关问题