- PR -

PreparedStatementについて

投稿者投稿内容
いっぱいいっぱい
会議室デビュー日: 2004/02/12
投稿数: 8
投稿日時: 2004-02-12 17:42
Javaを勉強し始めて、1ヶ月の初心者です。
初めて、投稿させて頂きます。

以下のようなSQLを実行して、AAAテーブルの該当するUSERIDのPASSWD項目を
更新したいと考えています。

以下の対応するUSERID(=変数user_id)、PASSWD(=変数hash_pass)は
DBに接続する前段階で既に取得済みですので、
setStringで以下のように指定しております。

しかし、実行してもDBは更新されておりません。
しかもエラーも検知されません(^^

どなたか、原因がお分かりになる方がいらっしゃいましたら
何卒、ご教授頂けないでしょうか?

どうぞ、よろしくお願いいたします。

<問題と思われる箇所>

PreparedStatement stmt = con.prepareStatement("UPDATE AAA SET PASSWD=? where
userid=?");
stmt.setString( 1, hash_pass );
stmt.setString( 2, user_id );
stmt.executeUpdate();




<以下、全文です。>

//ActionFormから入力情報を取得(処理対象ID)
ZRHPwd02QueryForm QueryForm2 = (ZRHPwd02QueryForm)form;
String user_id = QueryForm2.getUserid();


//ランダムな文字列を取得する。
String hash_pass = ZRXabc.abcPass(random_pass);

ResultSet rs = null;
Connection con = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@******";
String user = "***";
String password = "***";
con = DriverManager.getConnection(url, user, password);

PreparedStatement stmt = con.prepareStatement("UPDATE ZRDBB01Z SET PASSWD=? where userid=?");
stmt.setString( 1, hash_pass );
stmt.setString( 2, user_id );

stmt.executeUpdate();


System.out.println ("処理は通過!"); //後で削除
}catch(Exception e){
e.printStackTrace(System.out);
System.out.println ("DBアクセスエラー!"); //後で削除
return mapping.findForward("SystemError");
}finally{
try{
if(rs != null) rs.close();
if(con != null) con.close();
}catch(Exception e){
System.out.println ("エラー!"); //後で削除
}
}

yuzy
大ベテラン
会議室デビュー日: 2002/02/14
投稿数: 117
投稿日時: 2004-02-12 17:47
commit()していない、というオチでは?
ふーばー
大ベテラン
会議室デビュー日: 2003/06/05
投稿数: 163
投稿日時: 2004-02-12 17:48
コード:
stmt.executeUpdate();



この戻り値の値はどうなっていましたか?
0件:SQLのミス(キー不一致も含む)
1件以上:autoCommit が off になっていて コミットしていない。
いっぱいいっぱい
会議室デビュー日: 2004/02/12
投稿数: 8
投稿日時: 2004-02-12 18:44
ご返信まことに有難うございました。

戻り値を表示させるのに苦労していました。。。
戻り値は0件になっていました。

ちなみに私のソースは、明示的にcommitをしていないのですが
明示的に行う必要があるのでしょうか?

というのは、以前、Statementを使用した以下のコードでは
commitせずとも、DBに情報が更新されていたので
commitする必要はないのかな?と勝手に思っておりました。

超初歩的な質問で申し訳ございません。

Statement stmt = con.createStatement();
String sql = "UPDATE ZRDBB01Z SET";
sql = sql + " PASSWD='" + hash_pass + "'";
sql = sql + " where (userid='" + user_id +"')";
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2004-02-12 19:46
引用:

いっぱいいっぱいさんの書き込み (2004-02-12 18:44) より:
ちなみに私のソースは、明示的にcommitをしていないのですが
明示的に行う必要があるのでしょうか?


 いりませんね。
なぜなら、オートコミットはデフォルトではtrueですし、
ソースを見る限りオートコミットをfalseにはしていないからでです。
他のところに原因がありそうですね。

[ メッセージ編集済み 編集者: taku 編集日時 2004-02-12 19:47 ]
いっぱいいっぱい
会議室デビュー日: 2004/02/12
投稿数: 8
投稿日時: 2004-02-12 19:55
ご教授有難うございました。

ふーばーさんが仰られている通り、executeUpdate();の戻り値が"0"だったので
SQL文のエラーなのでしょうか・・・?

ちなみに列名やテーブル名等は確認しておりますので、
問題ございません。
怪しいのは、以下の記述ではないか?と考えています。
stmt.setString( 1, hash_pass );
stmt.setString( 2, user_id );

上記のhash_pass変数にString型の「abc」という文字列が
挿入されていた場合、
実際に手でSQLを発行する際は、「UPDATE 〜 SET PASSWD='abc'〜」
という具合に「'」で文字列を囲む必要があると考えております。

ただ、stmt.setString( 1, 'hash_pass' );等の記述も色々試してみましたが
なかなか成功しない状態です(^^
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2004-02-12 20:47
引用:

いっぱいいっぱいさんの書き込み (2004-02-12 19:55) より:
ふーばーさんが仰られている通り、executeUpdate();の戻り値が"0"だったので
SQL文のエラーなのでしょうか・・・?


 SQL文のエラーなら例外が発生しますから、
単に条件にマッチしていないだけでしょうね。
いっぱいいっぱい
会議室デビュー日: 2004/02/12
投稿数: 8
投稿日時: 2004-02-12 20:56
何度も、ご回答頂きまして有難うございます。

「条件にマッチしていない」と仰られているのは、例えば「user_id」に
設定される値が実際には、DBに無いような場合を仰られているのでしょうか?

そのような場合も、SQL的には、Exceptionを発生させるのではないでしょうか?

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