我正在尝试使用过程将图像保存在SQL-SERVER数据库中。我具有带有输入参数的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与IMAGE类型的sql-server DB的兼容类型。
将流插入到Blob中时,JDBC驱动程序将从中读取指定的长度,并且完成后不会重置该流。在您的示例中,将此流用于占位符2,然后再次用于占位符3,并每次指定基础byte []的整个长度。这样,当驱动程序到达占位符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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句