- - PR -
OleDbのDeleteを、複数レコードいっぺんに実行させたいです。
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-04-12 16:18
返事遅くなってしまってすいません。
>囚人さん、なちゃさん OleDbCommand.ExecuteNonQuery()を使用したら、OleDbCommandだけでDB更新できました。深い意味は別として、DBに更新をかけるという機能としては同じ意味合いなのかなと思っています。 >Jittaさん 返答ありがとうございます。「プログラムは作成されているとおりに動きます。」は、おっしゃる通りです。今回は、教えていただいたOleDbCommandだけを使用するという道と、納期が迫っているので、この方法で行こうと思いますが納品したら、例外の発生条件を調べようと思います。 >鎌田さん 度々、丁寧な説明、ありがとうございます。 このスレッドを通じてとても勉強になりました。 | ||||||||
|
投稿日時: 2006-04-12 21:39
強いることはしませんが、意図通りに実装されているか、確認しておいた方がいいと思います。
同時実行処理違反は、メッセージの通り、処理できるデータが1件もない場合に発生します。 つまり、流した SQL 文、特に条件の指定がおかしいか、その条件に一致するものをすでに変更済み(今回は削除)であるから、発生します。どこかで、実装と意図がずれています。 ついでに。知ることは、デバッグの第一歩です。 | ||||||||
|
投稿日時: 2006-04-12 23:00
わかった。。。
Delete メソッドで削除するようにマークされた1行1行について、SQL の DELETE 文が実行されるのに、最初の1行目を削除しようとしたときに実行される SQL 文で、すべての該当行が削除されてしまう。。。 | ||||||||
|
投稿日時: 2006-04-13 18:23
Jittaさん、こんばんわ。
ここまで真剣に付き合ってくれるなんて本当に感謝です。 で、Jittaさんの返答なんですが、こういう理解でただしいのでしょうか? ・「DataTableの更新」でのDELETE関数を処理している部分は1レコード1レコード単位に対して、「データベースの更新」でのUpdate関数に渡すSQL文はいっぺんに複数レコード削除している為、整合性というか、処理の意味合いが異なる為、エラーが発生している。 上記が正しいのであれば、DataTableのDELETE関数もSQL文でいっぺんに削除すればOKのような気がしますが、そのようなことはできるのでしょうか? | ||||||||
|
投稿日時: 2006-04-13 19:03
DataAdapter.Update() を用いてのデータベースへの反映は、DataTable の各 DataRow の状態によって決定します。 DataRow の状態が「更新」ならば、UpdateCommand、DataRow の状態が「追加」ならば、InsertCommand、DataRow の状態が「削除」ならば、DeleteCommand が実行されます。 各行は単純に DataCommand.ExecuteNonQuery() が実行されているだけのイメージです。それを繰り返し実行しているだけですね。 ここで、「削除」の状態である DataRow が2行以上あるとしましょう。 DataAdapter.Update() によって、1行目の DeleteCommand が実行されます。 次に、2行目の DeleteCommand が実行されます。このとき、既に2行目のデータが1行目の Delete によって削除されていたらどうなるでしょうか?
それが、一回だけ DataCommand.ExecuteNonQuery() を行うという事です。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2006-04-13 21:53
あ〜、囚人さんが説明してくださっているので、一点。
調べる時間が取れなかったのはわかります。しかし、それは調べない理由にはなりません。 使い方を知っていなければ、道具は使えません。または、使い方を誤り、大怪我をする可能性があります。 今回、たまたま、小さな怪我ですますことが出来ました。大怪我をする前に、道具について学んでください。 〆 written by Jitta@わんくま同盟 on 2006/04/13 □ Microsoft MVP for Visual Developer ASP/ASP.NET October, 2005 - September, 2006 |