Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java实现sqlserver数据库中的图像存储_Java_Sql_Sql Server - Fatal编程技术网

用java实现sqlserver数据库中的图像存储

用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

我正在尝试使用过程在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[] 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的兼容类型是什么呢。