[java] 在DB2 Express-C上執行PreparedStatement時出錯



1 Answers

嘗試打印準備好的語句並對數據庫運行查詢。

Question

當通過Statement對象執行查詢時,工作正常,但PreparedStatement對象執行相同的查詢會引發SQL異常。

這個查詢工作正常...

 String query = "SELECT A, B, C, D, LOBJ FROM TABLE WHERE LOBJ = 'sGMMEMDEML2';

Statement stmt = con.createStatement()

ResultSet rs = stmt.executeQuery(query);

此查詢會引發sql異常(DB2 SQL錯誤:SQLCODE = -302,SQLSTATE = 22001,SQLERRMC = null)...

String query = "SELECT A, B, C, D, LOBJ FROM TABLE WHERE LOBJ = ?;

PreparedStatement preStmt = con.prepareStatement(query);

preStmt.setString(1, 'sGMMEMDEML2');

ResultSet rs = preStmt.executeQuery();

view TABLE中的列LOBJ是10個字符長,但是由於Application中的某些限制,where子句中的指定值可能是或不是10個字符。

任何人都可以幫助我,這可以用PreparedStatement執行。

提前致謝。




我們正在使用DB2 9.7.x,現在我遇到同樣的問題,並發現這與將DB2 JDBC連接參數“deferPrepares”設置為“false”相關。

如果將“deferPrepares”設置為“true”或從連接字符串中省略參數,則PreparedStatement將執行而不會出現錯誤。 這僅在通過“=”或“<>”比較字符串列時才會發生。 如果你比較列的“喜歡”,那麼沒有錯誤。

我認為這個行為是一個主要的bug,因為它與任何SQL命令窗口中顯示的行為有所不同。

不幸的是,我們設置了deferPrepares為false來解決布爾字段由Hibernate映射到Smallint列的另一個問題。 這個問題至少在DB2 JDBC驅動程序版本9.7修訂包8中得到了解決(請參閱APAR no。IC88582, 網址http://www-01.ibm.com/support/docview.wss?uid=swg21415236 )。

所以我的建議是將deferPrepares設置為true,並使用Fix Pack 8或更高版本的JDBC驅動程序。






Related



Tags

java java   db2