- PR -

OleDbのDeleteを、複数レコードいっぺんに実行させたいです。

投稿者投稿内容
まーちゃん
会議室デビュー日: 2006/04/10
投稿数: 7
投稿日時: 2006-04-10 19:50
初めて書き込みします。よろしくお願いします。
C#のOleDbを使用して、データベースとのやり取りを行ってます。

今までは、複数レコードいっぺんに削除する要件がなかった(1レコードを選択させ、削除させる)為、IDを条件として1レコード毎にDataTableの更新と、SQL文をOleDbDataAdapterに投げてDeleteしていました。

しかし、今回、ログをクリアする機能が必要になりました。
ログのテーブルにはID(一意となるもの)はなく、何月何日から何月何日までのログを削除するという機能です。

【SQL文】
DELETE FROM ログテーブル WHERE ( RENEWDATE >= '2006/04/01' ) AND ( RENEWDATE <= '2006/04/10' ) "

【ソース】
○DataTableの更新
foreach (DataRow DRTmp in M_DataTable.Select(何月何日から何月何日までのログを削除の条件文))
{
//条件でひっかかったレコードの削除
DRTmp.Delete();
}

○データベースの更新
OleDbDataAdapter oledbAdapter = new OleDbDataAdapter();
OleDbCommand ole_DBCommand = M_ole_DBConnection.CreateCommand();
ole_DBCommand.CommandText = 何月何日から何月何日までのログを削除の条件文;
oledbAdapter.DeleteCommand = ole_DBCommand;
oledbAdapter.Update(in_DT);←"同時実行違反 : DeleteCommand によって 0件処理されました。"

上記の部分でエラーになります。
処理はうまく実行できています。DBの方もしっかり削除できているのですが、なぜか、エラートラップに引っかかってしまいます。
データベースの更新の方で、1レコード毎を処理する場合はエラーにはならないのですが、複数レコードをいっぺんに処理しようとするとエラーになります。

複数レコードいっぺんに削除はできないのでしょうか?
エラーが出なくなる処理の仕方、又は、複数件処理するにはこのような処理をするなどの指摘をどうかよろしくお願いします。

文章下手ですいません。
鎌田
常連さん
会議室デビュー日: 2003/09/23
投稿数: 45
投稿日時: 2006-04-10 20:49
>ole_DBCommand.CommandText = 何月何日から何月何日までのログを削除の条件文;

で更新すれば、

>○DataTableの更新

の方は不要です。

ログデータ=DataTableのデータの件数にもよるでしょうが、oledbAdapterと関連
づけない独立したOleDbCommandでデータベースから削除した後に、ログ表示対象
を再度表示しなおせばよいのではありませんか。

1. ログデータをDataAdapter.Fill(DataTable)で表示。
2. 削除はOleDbCommandでDELETE文を発行。
3. ログデータをDataAdapter.Fill(DataTable)で表示。

DataAdapterはSelectCommandだけでDeleteCommandの定義不要。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-10 21:18
OleDbDataAdapter をわざわざ使わなくても、単純に OleDbCommand.ExecuteNonQuery() すれば良いという事ですね。
_________________
囚人のジレンマな日々
まーちゃん
会議室デビュー日: 2006/04/10
投稿数: 7
投稿日時: 2006-04-10 21:31
>鎌田常連さん
返信ありがとうございます。

>oledbAdapterと関連づけない独立したOleDbCommandでデータベースから削除した後に、ログ表示対象を再度表示しなおせばよい
OleDbCommandだけで、DB更新できるのでしょうか?
たしかに、OleDbDataAdapterのUpdate関数を使用すると、引数に必ずDataTable系の引数が要求されてしまうので、関連づけないとダメなようです。

>DataAdapterはSelectCommandだけでDeleteCommandの定義不要。
現状では、SelectCommandは使用していなく、DataTableに対してSelectをかけています。
このやり方は正しくないのでしょうか?

自分の思考では、DataTableとDataAdapterは1セットで、お互い更新しなければ、DBの更新はできないと思っているのですが、正しいのでしょうか?
まーちゃん
会議室デビュー日: 2006/04/10
投稿数: 7
投稿日時: 2006-04-10 21:33
>囚人ぬしさん
返信ありがとうございます。

おぉぉぉぉぉ!
これは、OleDbDataAdapterのUpdate関数と同じ意味合いを指す物なのでしょうか?
さっそく調べてみます。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-04-10 23:29
引用:

まーちゃんさんの書き込み (2006-04-10 21:33) より:
おぉぉぉぉぉ!
これは、OleDbDataAdapterのUpdate関数と同じ意味合いを指す物なのでしょうか?
さっそく調べてみます。


あいや、ちょいーと誤解がありそうなので、まあ、調べてみるといいと思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-04-11 06:14
引用:

まーちゃんさんの書き込み (2006-04-10 19:50) より:

oledbAdapter.Update(in_DT);←"同時実行違反 : DeleteCommand によって 0件処理されました。"

上記の部分でエラーになります。
処理はうまく実行できています。DBの方もしっかり削除できているのですが、なぜか、エラートラップに引っかかってしまいます。
データベースの更新の方で、1レコード毎を処理する場合はエラーにはならないのですが、複数レコードをいっぺんに処理しようとするとエラーになります。

複数レコードいっぺんに削除はできないのでしょうか?
エラーが出なくなる処理の仕方、又は、複数件処理するにはこのような処理をするなどの指摘をどうかよろしくお願いします。


 言及がありませんが、まず、この例外の発生条件を調べましょう。そうすれば、なぜ例外が送出されるのに、データベースからデータが削除されているか、わかります。

 次に、どこで、どんな処理が行われるか、コードを逆設計します。
 よく言われることですが、プログラムは作成意図通りには動きません。作成されているとおりに動きます。今回、意図と作成された結果がずれているので、おかしな動きをしていると感じるのです。
鎌田
常連さん
会議室デビュー日: 2003/09/23
投稿数: 45
投稿日時: 2006-04-11 10:07
>自分の思考では、DataTableとDataAdapterは1セットで、お互い更新しなければ、DBの更新はできないと思っているのですが、正しいのでしょうか?

SQL文を発行してDBを操作するのは、OleDbCommand の役割です。
OleDbCommand はOleDbAdapterとは独立して存在できます。
SELECTでもUPDATEでもDELETEでもINSERTでもその他DDL文でも。

OleDbAdapterは、DataTableやDataSetなどとデータ元(DB)を
プログラマが定義したOleDbCommandを使って結びつけるものです。

ローカルでデータ処理することがなくて、データ元(DB)で処理を
完結できる場合 = DataTableにデータを取り込む必要がない場合は、
OleDbCommandだけで処理できるので、OleDbAdapterの出番はありません。

またデータ表示だけが必要で更新は必要ない場合や、
OleDbCommandを使って自力でデータ元(DB)を更新するような場合
は、OleDbAdapterにUPDATE,DELETE,INSERT用のOleDbCommandを
定義する必要がありません。

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