- PR -

同じデータベースへ連続してINSERTできない

投稿者投稿内容
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-04-21 14:08
こんにちはnabeママです。また皆さんのお知恵を拝借させて下さい。

同じデータベースに連続してINSERTしようとしてるのですが、最初の1件は出来るのですが2件以降、INSERTされません。どこがおかしいのでしょうか?

for (int i=0; i<List.length; ++i) {
try {
con = DriverManager.getConnection("jdbc:odbc:DocMDB");
stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO TB ( ID, Cat, No, Kubun ) values values("nabe", "05", 100, 0));
} catch (Exception e) {
e.printStackTrace();
}
finally {
try { rs.close(); } catch (Exception e) {}
try { stmt.close(); } catch (Exception e) {}
try { con.close(); } catch (Exception e) {}
}
}

こう書きました。よろしくお願いします。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2003-04-21 14:17
どのようなエラーが表示されたのか明記されないと 答えようがないです。
あるいは 回答をする人が限られます。

しいて答えると 、キーが重複しているのでは?したがって主キーの値を毎回変えれば、よいのでは?
yuu
大ベテラン
会議室デビュー日: 2002/06/12
投稿数: 152
お住まい・勤務地: 美味しいケーキ店のそば
投稿日時: 2003-04-21 14:25
nabeママさん、こんにちは。
エラーとかは発生していないのでしょうか?

エラーの原因は 七味唐辛子 さんがかかれてるようなことかな ??

あと、一般論として getConnection() や createStatement() は外にループの外に出して 1度だけ実行し、ループ内では同じ stmt を使いまわすのが良いと思います。
このプログラムだと、毎回 DB接続、解除をしているのでCPUリソースをすごく無駄に使う事になると思います


[ メッセージ編集済み 編集者: yuu 編集日時 2003-04-21 14:27 ]

[ メッセージ編集済み 編集者: yuu 編集日時 2003-04-21 14:30 ]
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-04-21 14:53
nabeママです。そうそうありがとうございます。

すみません。書き方がまずかったです。
リストボックスで選択された分だけ、DBに追加しており、

stmt.executeUpdate("INSERT INTO TB ( ID, Cat, No, Kubun ) values ("nabe", "05", 100, 0));

の"nabe"が変わります。ですからキーの重複ではないと思います。
エラーは
} catch (Exception e) {
  out.println("DB処理エラー");
  e.printStackTrace();
}
のように書いた場合、ブラウザに「DB処理エラー」と出ます。
これがなければエラーが表示されません。(でもDBにはINSERTされてません)

yuuさんのおっしゃるとおり最初は、getConnection() や createStatement() をループの外に出して 1度だけ実行し、ループ内はSQLの実行だけにしていたのですが、質問のように最初の1件しかINSERTできなかったのでだめなのかなぁと思いました・・・
一般論はそうですよね。
となるとSQLの書き方がまずいのでしょうか・・・
焼きそば
ベテラン
会議室デビュー日: 2002/11/06
投稿数: 86
お住まい・勤務地: 東京
投稿日時: 2003-04-21 14:58
失礼します。

ループの中でコネクションを切ってませんか?
finallyにそれらしいことが書かれていますが。

接続はループの外→切断はループの中だと、
2回目のループで切断されているのにINSERTに行こうとして
失敗すると思いますが。
yuu
大ベテラン
会議室デビュー日: 2002/06/12
投稿数: 152
お住まい・勤務地: 美味しいケーキ店のそば
投稿日時: 2003-04-21 15:55
おつかれさまです 〜〜
} catch (Exception e) {
  out.println("DB処理エラー");
  e.printStackTrace();
}

e.printStackTrace(); にはエラー原因につながる情報が含まれているでしょうから
それを、out に(ログファイルでも良いですが) に出力出来るようにしましょう。

JDK APIドキュメントの Throwable クラス(Exceptionの親クラス)を見ればヒントになると思います。

焼きそば さん、そうですね getConnection() 等をループの外に出す場合は close も
ループの外に出さないとダメですね ^^);

nabeママさん Good Luck!
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2003-04-21 16:12
yuuさんのコードに補足すると

} catch (SQlException e) {
  out.println("DB処理エラー");
  e.printStackTrace();
} catch (Exception e) {
  e.printStackTrace();
}

こちらの方がより明示的だと思います。


[ メッセージ編集済み 編集者: 七味唐辛子 編集日時 2003-04-21 16:13 ]
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-04-21 16:49
nabeママです。
みなさん本当にありがとうございます。

yuuさんのコメントをヒントにエラーをoutしましたら、七味唐辛子さんの最初のご指摘どおり、キーが重複しているとのこと。
おかしいなと思ってDBの設計を確認したら、キーの設定で重複ありになっていなかったことが原因でした。
改めて皆様に私のふがいなさをお詫びいたします。

yuuさんのエラーをoutする方法は知らなかったのでこれから気をつけてoutするようにしたいと思います。

ありがとうございました。m(__)m


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