- - PR -
PreparedStatementについて
1|2|3
次のページへ»
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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 ("エラー!"); //後で削除 } } | ||||
|
投稿日時: 2004-02-12 17:47
commit()していない、というオチでは?
| ||||
|
投稿日時: 2004-02-12 17:48
この戻り値の値はどうなっていましたか? 0件:SQLのミス(キー不一致も含む) 1件以上:autoCommit が off になっていて コミットしていない。 | ||||
|
投稿日時: 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 +"')"; | ||||
|
投稿日時: 2004-02-12 19:46
いりませんね。 なぜなら、オートコミットはデフォルトではtrueですし、 ソースを見る限りオートコミットをfalseにはしていないからでです。 他のところに原因がありそうですね。 [ メッセージ編集済み 編集者: taku 編集日時 2004-02-12 19:47 ] | ||||
|
投稿日時: 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' );等の記述も色々試してみましたが なかなか成功しない状態です(^^ | ||||
|
投稿日時: 2004-02-12 20:47
SQL文のエラーなら例外が発生しますから、 単に条件にマッチしていないだけでしょうね。 | ||||
|
投稿日時: 2004-02-12 20:56
何度も、ご回答頂きまして有難うございます。
「条件にマッチしていない」と仰られているのは、例えば「user_id」に 設定される値が実際には、DBに無いような場合を仰られているのでしょうか? そのような場合も、SQL的には、Exceptionを発生させるのではないでしょうか? | ||||
1|2|3
次のページへ»
