2014-09-13 67 views
2

我想保存圖像在SQL服務器數據庫使用過程。我有一個PROCEDURE名稱與輸入參數,但我沒有過程語法。圖像存儲在SQL服務器數據庫使用java

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

我要的是與圖像類型的SQL服務器的數據庫兼容Java類型。

回答

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(); 
+0

謝謝你,這個工作。但我仍然面臨 - 「錯誤消息:操作數類型衝突:nvarchar與圖像SQLSTATE不兼容:S0002錯誤代碼:206錯誤代碼:0」問題。 – 2014-09-13 10:19:21

+0

是基礎表nvarchar而不是varbinary中的列數據類型?如果是這樣,該列需要更改爲varbinary。 – 2014-09-13 10:43:10

+0

只有我有訪問數據庫,我無法看到數據庫結構。 在這個DB coloumn類型是IMAGE.So什麼是IMAGE在Java代碼中的兼容類型。 – 2014-09-16 05:58:25

相關問題