java.sql.SQLException: 無法轉換為內部方式
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
at oracle.jdbc.driver.CharCommonAccessor.getLong(CharCommonAccessor.java:239)
at oracle.jdbc.driver.OracleResultSetImpl.getLong(OracleResultSetImpl.java:552)
at oracle.jdbc.driver.OracleResultSet.getLong(OracleResultSet.java:1575)
at org.apache.commons.dbcp.DelegatingResultSet.getLong(DelegatingResultSet.java:239)
at transtech.hibernate.Report_DBConnection.getCatalogueHoldingsTypeCrosstab(Report_DBConnection.java:2303)
at sibimol.web.reports.cataloging.CatalogueHoldingsTypeCrosstab.search(CatalogueHoldingsTypeCrosstab.java:337)
at sibimol.web.reports.cataloging.CatalogueHoldingsTypeCrosstab.formSubmit(CatalogueHoldingsTypeCrosstab.java:237)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)....................
第一眼看到這個exception時,以為是程式內的SQL語法有錯誤,便印出了SQL語法進去Oracle DB做了測試,SQL語法是可以select出資料來的。
那到底是哪裡出了問題?
仔細看了一下主控台的log,紅字提到的部份是"olist[2] = resultSet.getLong("item_number");",意思是說從這筆資料從DB撈出來為"Long型態",接著塞入陣列中,顯示在頁面上。我確認了一下item_number在DB中的值,型態為String,那難怪會出現exception了。
後來將語法改為:"olist[2] = resultSet.getString("item_number");"便無錯誤產生。
另外,google了一下發現這種例外錯誤還有可能發生在hibernate的*.hbm.xml設定檔中,假設DB中的類型為Long,而*.hbm.xml中設定成String,也會出現這樣的錯誤訊息。
總結以上,下次如果遇到相同的exception,處理的方法為:
1.先確認錯誤訊息中,錯誤的位置在哪裡
2.確認DB的資料類型與程式語法中的類型是否相同
3.確認DB資料值
4.最後修改資料類型應該就能解決問題了
0 comments:
Post a Comment