C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: mdb(OleDb)の更新ができない その2


(過去ログ 13 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■4033 / inTopicNo.1)  mdb(OleDb)の更新ができない その2
  
□投稿者/ hikaru (9回)-(2007/06/01(Fri) 21:36:44)

分類:[C# (Windows)] 

いつもお世話になります。hikaruです。つい先日にも質問させていただきました。
そのときは、お力をかして頂きありがとうございます。

Logデータ 番号 更新日
      60 20070531
       2 20070601 
上記のようなmdbファイルがあります。
更新日="20070601"のデータを更新したいのですが、エラーとなりした。
(番号=1、更新日=20070602と更新)

エラー内容
「同時実行違反:UpdateCommandによって、処理予定の1レコードのうち0件が処理されました。」

しかし、更新日="20070601"の判定も行われているようです。なのになぜ・・・
皆さんにお力をかりてばかりですが、最初の一歩の力をおかしください。


コーディング内容

//ログの取得
da3 = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Log", cn3);

//データセットへの読み込み
DataSet ds3 = new DataSet(Log);
da3.Fill(ds3, Log);

//データテーブルのセット
DataTable tb3 = ds3.Tables[Log];
tb3.PrimaryKey = new DataColumn[] { tb3.Columns["番号"] };
for (int i=0;i<tb3.Rows.Count ;i=i+1)
{
if (tb3.Rows[i]["更新日"].ToString() == "20070601")
{
tb3.Rows[i]["番号"] =1;
tb3.Rows[i]{"更新日"] = "20070602";
}
}

//更新処理
cmd3 = new System.Data.OleDb.OleDbCommand
("UPDATE " + Log + " SET 番号=?, 更新日 = ? ", cn3);
cmd3.Parameters.Add(new System.Data.OleDb.OleDbParameter("番号", System.Data.OleDb.OleDbType.BigInt, 4, "番号"));
cmd3.Parameters.Add(new System.Data.OleDb.OleDbParameter("更新日",
System.Data.OleDb.OleDbType.VarChar, 8, "更新日"));
da3.UpdateCommand = cmd3;
da3.Update(ds3, Log);
}

else
{
//エラー処理
---
}
よろしくお願いします。

引用返信 編集キー/
■4036 / inTopicNo.2)  Re[1]: mdb(OleDb)の更新ができない その2
□投稿者/ はつね (172回)-(2007/06/01(Fri) 23:09:04)
はつね さんの Web サイト
No4033 (hikaru さん) に返信
> エラー内容
> 「同時実行違反:UpdateCommandによって、処理予定の1レコードのうち0件が処理されました。」

Update文を自分で指定するのではなくCommandBuilder使ってみたらどうでしょうか。
また、「20070601」の行だけ更新するであれば、SELECT文にきちんとWHERE句を指定しましょう。

引用返信 編集キー/
■4042 / inTopicNo.3)  Re[2]: mdb(OleDb)の更新ができない その2
□投稿者/ hikaru (10回)-(2007/06/02(Sat) 16:13:21)
No4036 (はつね さん) に返信
はつねさん、ありがとうございます。

CommandBuilderではなく、UPDATE文で更新をしたいと思います。
わがままかもしれませんが、UPDATE文で教えていただけるとありがたいです。

ご指摘のとおり、SELECT文にWHERE句を入れました。
そのときの結果です。

パターン1.ダイレクトに、日付を指定。
("UPDATE " + Log + " SET 番号=? WHERE 更新日 = '20070601'", cn3);としたところ、
番号のみ更新されました。

パターン2.ダイレクトに、日付を指定しない。
("UPDATE " + Log + " SET 番号=? WHERE 更新日 = ?", cn3);としたところ、
「同時実行違反:UpdateCommandによって、処理予定の1レコードのうち0件が処理されました。」
のエラーが出ました。


お知恵を拝借するばかりで、なかなかお返しすることもできませんが、
よろしくお願いします。


> ■No4033 (hikaru さん) に返信
>>エラー内容
>>「同時実行違反:UpdateCommandによって、処理予定の1レコードのうち0件が処理されました。」
>
> Update文を自分で指定するのではなくCommandBuilder使ってみたらどうでしょうか。
> また、「20070601」の行だけ更新するであれば、SELECT文にきちんとWHERE句を指定しましょう。
>
引用返信 編集キー/
■4043 / inTopicNo.4)  Re[3]: mdb(OleDb)の更新ができない その2
□投稿者/ はつね (173回)-(2007/06/03(Sun) 10:11:38)
はつね さんの Web サイト
No4042 (hikaru さん) に返信
> CommandBuilderではなく、UPDATE文で更新をしたいと思います。
> わがままかもしれませんが、UPDATE文で教えていただけるとありがたいです。

CommandBuilder使って生成されたUPDATE文調べるのが近道だと思いますよ。
たぶん、予想もしていなかったUPDATE文のWHERE句になっているのではないでしょうか。

CommandBuilderを使わずにという選択をするのは自由ですが、DataAdapterを使う場合、SELECT文に対応したUPDATE文のWHERE句の書き方がある、つまり、あるSELECT文で検索したものに対しては、どんなUPDATE文を組み立てなくてはいけないかが決まっているようなものですから、そのあたりはCommandBuilderを学習教材として利用して、自動生成されたSQL文を理解して編集して流用するなどの事も必要です。
特に、自分で指定したUPDATE文で起こるはずのない同時実行違反などが起こるのであれば、SELECT文で取得したDataSetを使ってUpdateメソッドを実行するときにDataAdapterが期待しているUPDATE文とは異なるものを指定している可能性が高いです。

なお、DataAdapterのUpdateメソッドでは、DataSetの更新内容によってはUPDATE文ではなくDELETE文とINSERT文が実行されるときもありますからUPDATE文だけではなくINSERT文やDELETE文も仕込んでおく必要もあります。

引用返信 編集キー/
■4121 / inTopicNo.5)  Re[4]: mdb(OleDb)の更新ができない その2
□投稿者/ hikaru (12回)-(2007/06/06(Wed) 22:12:34)
No4043 (はつね さん) に返信
はつねさん、御礼が遅れてすいませんでした。

はつねさんのおっしゃる通り、CommandBuilderを使いました。
見事、更新処理が成功しました。(たいしたことではないのですよね、すいません)
それと、当たり前ですが、UPDATE文ではなくDELETE文とINSERT文が必要みたいです。
ご指摘ありがとうございます。

そこで、勉強のため、CommandBuilderで自動生成されたSQL文を調べたいのですが、何か調べる方法はありますでしょうか?
教えていただけると、とてもありがたいです。

> ■No4042 (hikaru さん) に返信
>>CommandBuilderではなく、UPDATE文で更新をしたいと思います。
>>わがままかもしれませんが、UPDATE文で教えていただけるとありがたいです。
>
> CommandBuilder使って生成されたUPDATE文調べるのが近道だと思いますよ。
> たぶん、予想もしていなかったUPDATE文のWHERE句になっているのではないでしょうか。
>
> CommandBuilderを使わずにという選択をするのは自由ですが、DataAdapterを使う場合、SELECT文に対応したUPDATE文のWHERE句の書き方がある、つまり、あるSELECT文で検索したものに対しては、どんなUPDATE文を組み立てなくてはいけないかが決まっているようなものですから、そのあたりはCommandBuilderを学習教材として利用して、自動生成されたSQL文を理解して編集して流用するなどの事も必要です。
> 特に、自分で指定したUPDATE文で起こるはずのない同時実行違反などが起こるのであれば、SELECT文で取得したDataSetを使ってUpdateメソッドを実行するときにDataAdapterが期待しているUPDATE文とは異なるものを指定している可能性が高いです。
>
> なお、DataAdapterのUpdateメソッドでは、DataSetの更新内容によってはUPDATE文ではなくDELETE文とINSERT文が実行されるときもありますからUPDATE文だけではなくINSERT文やDELETE文も仕込んでおく必要もあります。
>
引用返信 編集キー/
■4147 / inTopicNo.6)  Re[5]: mdb(OleDb)の更新ができない その2
□投稿者/ はつね (174回)-(2007/06/07(Thu) 19:21:11)
はつね さんの Web サイト
No4121 (hikaru さん) に返信
> そこで、勉強のため、CommandBuilderで自動生成されたSQL文を調べたいのですが、何か調べる方法はありますでしょうか?
> 教えていただけると、とてもありがたいです。

CommandBuilderを使った直後にブレイクポイントを設定しておいて、IDEでウォッチすればいいのでは?

引用返信 編集キー/
■4195 / inTopicNo.7)  Re[6]: mdb(OleDb)の更新ができない その2
□投稿者/ trapemiya (114回)-(2007/06/09(Sat) 01:25:55)
trapemiya さんの Web サイト
GetUpdateCommand().CommandText みたいな感じで。
引用返信 編集キー/
■4328 / inTopicNo.8)  Re[7]: mdb(OleDb)の更新ができない その2
□投稿者/ hikaru (14回)-(2007/06/14(Thu) 07:09:27)
No4195 (trapemiya さん) に返信
はつねさん、trapemiyaさんありがとうございます。
お礼が遅れて申し訳ございません。
4147、4195の確認はまだできていません。
すいません。

また、わからなかったら別のレスで質問させていただきます。
(ブレイクポイントなど、勉強中なので)

このレスを閉めさしていただいて、ブレイクポイントは別レスで質問させていただきます。
ありがとうございました。
今後ともよろしくお願いいたします。

> GetUpdateCommand().CommandText みたいな感じで。
解決済み
引用返信 編集キー/
■4329 / inTopicNo.9)  Re[8]: mdb(OleDb)の更新ができない その2
□投稿者/ hikaru (15回)-(2007/06/14(Thu) 07:09:45)
No4328 (hikaru さん) に返信
> ■No4195 (trapemiya さん) に返信
> はつねさん、trapemiyaさんありがとうございます。
> お礼が遅れて申し訳ございません。
> 4147、4195の確認はまだできていません。
> すいません。
>
> また、わからなかったら別のレスで質問させていただきます。
> (ブレイクポイントなど、勉強中なので)
>
> このレスを閉めさしていただいて、ブレイクポイントは別レスで質問させていただきます。
> ありがとうございました。
> 今後ともよろしくお願いいたします。
>
>>GetUpdateCommand().CommandText みたいな感じで。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -