JDBCドライバ
JDBCドライバ(postgresql-8.1-404.jdbc3.jar)のソースを読む。
というのも、以前のシステムで今まで動いていたソースがJDBCドライバのバージョンをあげたことによって例外が発生したため。
【現象】
以下のテーブルに対して
Table "yone" Column | Type | Modifiers --------+-----------------------+----------- id | integer | name | character varying(10) |
以下のSQLを実行
testdb=# insert into yone values('100', 'test'); INSERT 140912707 1
PreparedStatement ps = con.prepareStatement("insert into yone values(?, ?)"); ps.setString(1, "100"); ps.setString(2, "test"); int updCnt = ps.executeUpdate();
サーバのバージョン8系に対して、JDBCドライバのバージョン8系を使用した場合にのみ以下の例外が発生
org.postgresql.util.PSQLException: ERROR: column "id" is of type integer but expression is of type character varying at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1512) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1297) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:188) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:430) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:346) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:300)
おっしゃるとおりですが、何故サーバ8系&JDBCドライバ8系の時だけなぜ起こるのだろ?
まとめると
JDBCドライバのバージョン8系を使用した場合 ・サーバのバージョン7系は問題無く動作 ・サーバのバージョン8系に対しては例外発生 JDBCドライバのバージョン7系を使用した場合 ・サーバのバージョン7系は問題無く動作 ・サーバのバージョン8系は問題無く動作
ちなみにOracleでは問題なく動作。
結論、JDBCドライバ7系を使用 or プログラムで正しくsetIntを使用か。