2013-06-04 41 views
3

我收到錯誤代碼-4220與空SQL狀態錯誤代碼4220 .the SP「XXXXX」包含VARGRAPHICS數據類型。以下是完整的異常堆棧跟蹤。 SP正在正確執行,讀取輸出參數時發生錯誤,即執行方法調用成功,但getString方法發出錯誤。掌握空SQL國家

即使我試圖訪問任何方法來獲得輸出參數值,誤差即將到來。只是FYI,我嘗試了最新版本的db2驅動程序,但仍然錯誤仍然存​​在。

com.ibm.db2.jcc.am.SqlException: [jcc][t4][1065][12306][3.65.77] Caught java.io.CharConversionException. See attached Throwable for details. ERRORCODE=-4220, SQLSTATE=null 
    at com.ibm.db2.jcc.am.cd.a(cd.java:682) 
    at com.ibm.db2.jcc.am.cd.a(cd.java:60) 
    at com.ibm.db2.jcc.am.cd.a(cd.java:112) 
    at com.ibm.db2.jcc.am.gc.a(gc.java:2825) 
    at com.ibm.db2.jcc.am.gc.a(gc.java:582) 
    at com.ibm.db2.jcc.am.gc.q(gc.java:560) 
    at com.ibm.db2.jcc.am.gc.N(gc.java:1557) 
    at com.ibm.db2.jcc.am.gc.a(gc.java:1541) 
    at com.ibm.db2.jcc.am.CallableStatement.D(CallableStatement.java:941) 
    at com.ibm.db2.jcc.am.CallableStatement.getString(CallableStatement.java:920) 
    at com.cst.test.daoLayer.SPTest.callDB2ProcOUTParameter(SPTest.java:118) 
    at com.cst.test.daoLayer.SPTest.testLogic(SPTest.java:235) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:618) 
    at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99) 
    at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81) 
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) 
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75) 
    at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45) 
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66) 
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35) 
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42) 
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) 
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 
Caused by: java.nio.charset.MalformedInputException: Input length = 5 
    at com.ibm.db2.jcc.am.r.a(r.java:19) 
    at com.ibm.db2.jcc.am.gc.a(gc.java:2821) 
    ... 28 more 
Caused by: sun.io.MalformedInputException 
    at sun.io.ByteToCharUTF8.convert(ByteToCharUTF8.java:278) 
    at com.ibm.db2.jcc.am.r.a(r.java:16) 
    ... 29 more 

回答

6

我通過使用最新版本的jar和通過設置下面的系統屬性解決了問題。

System.setProperty("db2.jcc.charsetDecoderEncoder", "3"); 

另外一種方法是禁用Unicode編碼的字符,並在DB2 SP這也爲我工作VARCHAR類型..

+0

如何「禁用DB2 SP中的char和varchar類型的unicode編碼」,請您解釋一下。 –

1

經過大量的研究,我發現確切的罐子被下載到解決CharConversionException 。 具體說明。此問題在JDBC v9.7修訂包5中解決。此版本解決APAC74895(解決CharConversionException),以便跳過db中的特殊字符而不是拋出異常。

You need to download the appropriate jar from the IBM site

然後在烏爾tomcat的設置中添加以下環境變量(Java虛擬機參數) -Ddb2.jcc.charsetDecoderEncoder = 3

這就是它的問題解決了:)

7

遇到此之後同樣的錯誤,事實證明舊版本的db2jcc jar不支持Java 8.在恢復到Java 7之後,錯誤消失了。這也可以通過從IBM下載更新/支持的jar版本來解決。

1

在將DB列從CHAR更改爲VARCHAR之後,我們遇到了此問題。重新啓動我們的Java WAS服務器後,問題得到了解決 - 顯然,DB2驅動程序需要重新啓動以應對此問題。

0

現在不建議使用db2jcc.jar驅動程序。

識別您的DB2版本,包括最新的db2jcc jar文件到您的構建路徑。

在我的情況:DB2版本= 9.7.301.326,我加入

db2jcc-9.7.4.jar 

刷新和重新運行application.It爲我工作。

有關詳細信息:http://www-01.ibm.com/support/docview.wss?uid=swg21363866

0

我遇到的問題是我的db2jcc罐子已經過時,我的服務器被指向用於獲取DB2連接過時的罐子。

更新db2jcc jar解決了我的問題。