- PR -

Date型のNULL値をデータベースに投入できません

投稿者投稿内容
mrk
会議室デビュー日: 2004/04/11
投稿数: 13
投稿日時: 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が発生しています。

このような状況をプログラム側でどのように回避すればよいか、
ご存知であれば教えてください。

お願いします。
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2004-07-30 00:45
java.sql.PreparedStatementを使いましょう。
SQLインジェクション対策も兼ねてますので、
特殊な事情(糞OracleのJDBCドライバの実装上の制限とか)が無い限りは
こちらを使うことをお薦めします。

PreparedStatementについては、Google等で検索すれば80000件近くヒットしますので
そちらをどうぞ。最初の5,6件も読めば理解できると思います。
mrk
会議室デビュー日: 2004/04/11
投稿数: 13
投稿日時: 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値を含めて、全パラメータを更新したいと思いますが、可能でしょうか。
有識者の方々、お知恵を拝借ください。
mrk
会議室デビュー日: 2004/04/11
投稿数: 13
投稿日時: 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値を含めて、全パラメータを更新したいと思いますが、可能でしょうか。
有識者の方々、お知恵を拝借ください。
mrk
会議室デビュー日: 2004/04/11
投稿数: 13
投稿日時: 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/05/20
投稿数: 89
投稿日時: 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)
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 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 はいるんでしょうか?いらないと思ってました。
あってもエラーでないんでしょうか?
mrk
会議室デビュー日: 2004/04/11
投稿数: 13
投稿日時: 2004-07-30 11:44
kojiさん、あいつーさん、
ご回答ありがとうございます。

かなり基本的なことで恥ずかしいのですが、
Date型がNull値かどうか、判定方法が見つかりません。

Date型のAPIを見ると、equalsメソッドが使えるので、
Date nDate = null;
if(mDate.equals(nDate))
なんてやると、NullPointerExceptionエラーになってしまいます。
オブジェクトがNullだと、equalsは使えないようですね。

基本的なことですが、よい方法がないか、
教えてもらえるでしょうか。

JDK1.3.1を使っています。

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