- PR -

PreparedStatementオブジェクトのパラメータセットとSQLの実行

投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2005/04/16
投稿数: 51
投稿日時: 2005-07-12 12:10
PreparedStatementオブジェクトを利用してSQL(INSERT)を実行します。
開発は次の環境で行いました。
OS:Windows2000(SP4)
Java:1.4.2_03
Eclipse:2.1.2
PostgreSQL:8.0
パラメータは「?」を利用し、
ArrayListに収容された値を順にsetStringしていきます。
この環境では問題なく処理は終了しました。

SQL実行直前にPreparedStatementオブジェクトを標準出力させたところ、
各カラム値には自動的に「'」が付与され、
カラム値に「'」が含まれる場合には
その前に「\」も付加されていました。

ところがこの同じプログラムをMacに移植すると異常終了します。
環境は、
OS:Mac OS X Server 10.4
Java:1.4.2_07
Eclipse:3.0.2
PostgreSQL:8.0
です。

PreparedStatementオブジェクトを標準出力させたところ
「?」の位置にセットされた各パラメータは
「'」で括られていませんでした。

【例】
■ Windows
INSERT INTO Public.TEST VALUES ( '7033347960','2005-03-31','AAAA\'S', ・・・続く
■ Mac
INSERT INTO Public.TEST VALUES ( 7033347960,2005-03-31,AAAA'S, ・・・続く

「'」の前にエスケープ文字もありません。

環境として、Javaのバージョンも書きましたが
Eclipse上で実行していますので、もしかしたら別のVMを使っているのかも知れない、
と感じています。

しかし同じJavaで同じPGMを実行しても
このままでは今のMac環境で「?」→「setString」が使えません。

何が影響しているのか、どうすればよいのか、
どなたかお教えいただけませんでしょうか?

宜しくお願いいたします。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-07-12 18:17
根本的な解決につながるかはわかりませんが、怪しいと思われる点だけお知らせしたいと思います。

PreparedStatement#setString() メソッドを利用する限り、引数を SQL の文字列リテラルにするため、このメソッドはシングルクォートの付加、および、シングルクォートを含む値のエスケープ処理を行う必要があります。
(他の型、例えば setInt() 等では整数リテラルにするため、クォートの付加は一切行わない(付加しても良いが、DBMS 上で文字列→整数変換が発生してオーバーヘッドとなる)はずです。)
つまり、Windows 側の挙動が信頼できるということです。

このクォート処理は実際には、java.sql.PreparedStatement インタフェースを実装した、JDBC ドライバのクラス内で実行されます。すなわち、Mac 側の PostgreSQL JDBC ドライバが正しいものでない危険性が最初に疑われます。
ここから調べることをお勧めします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-07-12 19:12
「異常終了」とはどのような状態を指していますか? VMがダウンするのでしょうか?
未記入
ベテラン
会議室デビュー日: 2005/04/16
投稿数: 51
投稿日時: 2005-07-12 19:22
ご回答を賜り誠にありがとうございます。
ちなみに現在Mac側のJDBCドライバは
 Postgresql-8.0-311.jdbc3
です。
バージョンをダウングレードするなどして
試してみたいと思います。
今後とも宜しくお願いいたします。
未記入
ベテラン
会議室デビュー日: 2005/04/16
投稿数: 51
投稿日時: 2005-07-12 19:25
uk様、ご返信ありがとうございます。
「異常終了」と私が記載しておりますのは、
単に、
DBテーブルのDATA型カラム(等)に対して「'」をつけずINSERTしようとしたため
Postgreから「注意され」、
PGMが終了した、
という意味です。(すみません。確かにおかしな書き方でした。)
宜しくお願いいたします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-07-12 20:04
「注意され」「終了した」など、抽象的な自分なりの言葉で書くよりも、「xxxの例外が発生
した」といった具体的な情報を書かれたほうが有益なアドバイスが得られると思います。
未記入
ベテラン
会議室デビュー日: 2005/04/16
投稿数: 51
投稿日時: 2005-07-12 20:48
失礼致しました。
SQLExceptionです。
(遅ればせながら)
宜しくお願いいたします。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-07-12 21:58
引用:

未記入さんの書き込み (2005-07-12 20:48) より:

SQLExceptionです。



私の方では「文字列リテラルとして正しくないものを insert しようとしたので SQLException かな」と勝手に脳内補間しましたが、より正確を期するため、出力された SQLException のメッセージをすべてコピー&ペーストされるとよろしいかと思います。

今の場合はスタックトレースはあまり関係ないと思いますが、SQLException の後に DBMS が出力するメッセージが付加されていると思います。
そのメッセージ次第で、更に疑わしい点がわかるとか、回避策を講じた方が良いとかがあるやもしれません。

スキルアップ/キャリアアップ(JOB@IT)