我正在尝试使用程序在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。
答案 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();