- - PR -
Date型のNULL値をデータベースに投入できません
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2004-07-30 00:13
Java初心者です。
Tomcat4.1.30+PostgreSQL7.4.3 の環境です。 現在、以下のようなUPDATE文があり、 java.sql.Date mDate; //型宣言 <データベース接続文> statement.execute("UPDATE SET test_table set mDate='"+ mDate +"' "); mDateの値が「2004-07-30」のような場合には問題なく実行されますが、 「null」になる場合は、UPDATE文が、 「UPDATE SET test_table set mDate='null' 」というようになり、 余計な「''」があるためにNullPointerExceptionが発生しています。 このような状況をプログラム側でどのように回避すればよいか、 ご存知であれば教えてください。 お願いします。 |
|
投稿日時: 2004-07-30 00:45
java.sql.PreparedStatementを使いましょう。
SQLインジェクション対策も兼ねてますので、 特殊な事情(糞OracleのJDBCドライバの実装上の制限とか)が無い限りは こちらを使うことをお薦めします。 PreparedStatementについては、Google等で検索すれば80000件近くヒットしますので そちらをどうぞ。最初の5,6件も読めば理解できると思います。 |
|
投稿日時: 2004-07-30 11:06
koeさん、ご回答ありがとうございます。
おっしゃるようにPreparedStatementを利用することによって、 エラーは出なくなりました。 ただ、実際には、UPDATE文に他のパラメータ(Boolean型のmBln)もあり、 java.sql.Date mDate = null; boolean mBln = true; String mKey = 123; UPDATE SET test_table set mDate=?,mBln where key=? statement.setDate(1, mDate); statement.setBoolean(2, mBln); statement.setString(3, mKey); int cn = statement.executeUpdate(); と実行しても、 cn = 0 となり、更新されません。 mDate = '2004-7-30'; などの値を入れた場合は、 cn = 1 となり、データベースも更新されます。 一つのパラメータにnull値があっても、 null値を含めて、全パラメータを更新したいと思いますが、可能でしょうか。 有識者の方々、お知恵を拝借ください。 |
|
投稿日時: 2004-07-30 11:07
koeさん、ご回答ありがとうございます。
おっしゃるようにPreparedStatementを利用することによって、 エラーは出なくなりました。 ただ、実際には、UPDATE文に他のパラメータ(Boolean型のmBln)もあり、 java.sql.Date mDate = null; boolean mBln = true; String mKey = 123; UPDATE SET test_table set mDate=?,mBln where key=? statement.setDate(1, mDate); statement.setBoolean(2, mBln); statement.setString(3, mKey); int cn = statement.executeUpdate(); と実行しても、 cn = 0 となり、更新されません。 mDate = '2004-7-30'; などの値を入れた場合は、 cn = 1 となり、データベースも更新されます。 一つのパラメータにnull値があっても、 null値を含めて、全パラメータを更新したいと思いますが、可能でしょうか。 有識者の方々、お知恵を拝借ください。 |
|
投稿日時: 2004-07-30 11:11
先ほどのUPDATE文間違えました。 誤り UPDATE SET test_table set mDate=?,mBln where key=? ↓ 正しくは UPDATE SET test_table set mDate=?,mBln=? where key=? です。 |
|
投稿日時: 2004-07-30 11:22
あいつーです。
setNull(int, int)は使えませんか? http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/sql/PreparedStatement.html#setNull(int,%20int) |
|
投稿日時: 2004-07-30 11:24
こんにちは。
私の場合、if文でnullかどうか判定して、 statement.setDate(1, mDate); か、 statement.setNull(1, java.sql.Types.DATE); を設定してましたが、このようなやり方はどうなんでしょうか? UPDATE SET test_table set mDate=?,mBln=? where key=? の SET はいるんでしょうか?いらないと思ってました。 あってもエラーでないんでしょうか? |
|
投稿日時: 2004-07-30 11:44
kojiさん、あいつーさん、
ご回答ありがとうございます。 かなり基本的なことで恥ずかしいのですが、 Date型がNull値かどうか、判定方法が見つかりません。 Date型のAPIを見ると、equalsメソッドが使えるので、 Date nDate = null; if(mDate.equals(nDate)) なんてやると、NullPointerExceptionエラーになってしまいます。 オブジェクトがNullだと、equalsは使えないようですね。 基本的なことですが、よい方法がないか、 教えてもらえるでしょうか。 JDK1.3.1を使っています。 |
