使用java存储在sql server数据库中的映像

时间:2014-09-13 08:03:48

标签: java sql sql-server

我正在尝试使用程序在SQL-SERVER数据库中保存Image。我有一个带有输入参数的PROCEDURE名称,但我没有程序语法。

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

我想要的是兼容类型的Java与sql-server的IMAGE类型的DB。

1 个答案:

答案 0 :(得分: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();