Quantcast
Channel: 質問!ITmedia 新着質問(Java/253)
Viewing all articles
Browse latest Browse all 2439

ResultSetでSQLException

$
0
0
ResultSetのgetString()でSQLExceptionが発生します。 今まで正常稼働していたWebアプリケーションで初めて以下のエラーが発生しました。 検索しても同じようなメッセージのものを見つけられず、原因、エラーの意味がよくわかりません。 どのような原因が考えられますか? 発生前と後で変わった環境は、 AS/400(iSeries)のバージョンが  V5R4 から V7R1 に変わったことくらいです。 プログラムは画面表示データを取得し、beanにセットするというものです。 ---------------------------------------------------------- <出力されたエラー> java.sql.SQLException: Descriptor index not valid.(34648) at com.ibm.as400.access.JDError.throwSQLException(JDError.java:480) at com.ibm.as400.access.JDServerRow.getSQLData(JDServerRow.java:441) at com.ibm.as400.access.AS400JDBCResultSet.getValue(AS400JDBCResultSet.java:3543) at com.ibm.as400.access.AS400JDBCResultSet.getString(AS400JDBCResultSet.java:3173) at com.ibm.as400.access.AS400JDBCResultSet.getString(AS400JDBCResultSet.java:3198) at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:224) (以下略) ---------------------------------------------------------- プログラムは一部の抜粋ですが、以下のような感じです。 ---------------------------------------------------------- <プログラム抜粋> PreparedStatementps= null; ResultSetrs= null; StringBuffer sql = new StringBuffer(); sql.append("SELECT "); sql.append("table1.title AS title, "); sql.append("table1.bango AS bango, "); sql.append("table2.date AS date, "); sql.append("table1.jokyo AS jokyo "); sql.append("FROM "); sql.append("table1 "); sql.append("LEFT OUTER JOIN table2 "); sql.append("ON table1.key1 = table2.key2 "); sql.append("WHERE table1.key11 = 1 "); String strSql = sql.toString(); try{ ps = conn.prepareStatement(strSql); // 結果の取得 while (rs.next()) { TestBean bean = new TestBean(); bean.setTitle(rs.getString("title")); bean.setBango(rs.getString("bango")); bean.setJokyo(rs.getString("jokyo"));//←ここでSQLException bean.setDate(rs.getString("date")); } } catch(Exception e) { log.fatal("Exception\n", e); throw new testException(e); } finally { // DB接続、取得結果の解放などを行う。 try { if (rs != null) { rs.close(); rs = null; } if (ps != null) { // prepareStatementを閉じ、nullを格納する。 ps.close(); ps = null; } } catch(Exception e) { throw new testException(e); } } ---------------------------------------------------------- エラーの発生するデータのフィールド jokyo を見てみると 何故か定義されているバイト数より多い文字列が登録されていました。 そこでSQLのSELECT文を以下のように エラーの発生するフィールド(jokyo)をSELECT文の最後にせず、 dateが最後になるよう変更したところエラーはでなくなりました。 title、jokyo はテキストフィールド、 bango、date は数値フィールドです。 ---------------------------------------------------------- <変更したSQL部分> sql.append("SELECT "); sql.append("table1.title AS title, "); sql.append("table1.bango AS bango, "); sql.append("table1.jokyo AS jokyo, ");//←jokyoを最後にしない sql.append("table2.date AS date "); sql.append("FROM "); sql.append("table1 "); sql.append("LEFT OUTER JOIN table2 "); sql.append("ON table1.key1 = table2.key2 "); sql.append("WHERE table1.key11 = 1 "); ---------------------------------------------------------- なんとなくエラーメッセージの「index」からこのように変更してみましたが、 エラーがでなくなった理由もよくわかりません。 長々とわかりづらい書き方で申し訳ありません…。 何かわかる方がいらっしゃいましたら、どうかご教示ください。 よろしくお願いいたします。

Viewing all articles
Browse latest Browse all 2439

Trending Articles