用java实现sqlserver数据库中的图像存储
我正在尝试使用过程在SQL-SERVER数据库中保存映像。我有一个带有输入参数的过程名称,但没有过程语法用java实现sqlserver数据库中的图像存储,java,sql,sql-server,Java,Sql,Sql Server,我正在尝试使用过程在SQL-SERVER数据库中保存映像。我有一个带有输入参数的过程名称,但没有过程语法 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[] immAsB
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的DB映像类型。将流插入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不兼容:s002错误代码:206错误代码:0”问题。基础表中的列数据类型是否为nvarchar而不是varbinary?如果是这样,则需要将列更改为varbinary。我只有对DB的访问权限,无法看到DB结构。在这个数据库中,column类型是IMAGE。那么在java代码中,IMAGE的兼容类型是什么呢。