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

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

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

Re[5]: mdb(oleb)の更新ができない


(過去ログ 15 を表示中)

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

■5253 / inTopicNo.1)  mdb(oleb)の更新ができない
  
□投稿者/ hikaru (16回)-(2007/07/09(Mon) 12:04:11)

分類:[C# (Windows)] 

いつもお世話になります。

C#でmdbの更新処理をしています。
処理内容は、管理テーブルの名称を「顧客データ」に変更します。そこで、エラーとなりました。

  …(省略しています)
ds4.Tables["管理テーブル"].Rows[i]["名称"] = "顧客データ";
da4.Update(ds4, "管理テーブル");

エラー内容。
「同時実行違反 : UpdateCommand によって、処理予定の 1 レコードのうち 0 件が処理されました。」
Update直前のdt4(データテーブル),ds4(データセット)とも名称には、「顧客データ」と変更されています。

わかりづらい文章かもしれませんが、よろしくお願いします。
引用返信 編集キー/
■5254 / inTopicNo.2)  Re[1]: mdb(oleb)の更新ができない
□投稿者/ 片桐 (28回)-(2007/07/09(Mon) 12:52:42)
更新先テーブルの構成はどうなっていますでしょうか?

テーブルの主キーは?
列とタイプは?
どうやってデータセットに入れたんでしょうか?

もう少し情報をいただけると皆さんが助かるかと……
よろしくお願いします。
引用返信 編集キー/
■5257 / inTopicNo.3)  Re[1]: mdb(oleb)の更新ができない
□投稿者/ 魔界の仮面弁士 (331回)-(2007/07/09(Mon) 13:10:49)
No5253 (hikaru さん) に返信
> 「同時実行違反 : UpdateCommand によって、処理予定の 1 レコードのうち 0 件が処理されました。」

UPDATE の SQL を 1 件分実行したが、処理件数が 0 件であった、ということですね。

更新用のコマンド定義に問題がある可能性がありますので、OleDbDataAdapter(または TableAdapter)の
UpdateCommand プロパティに設定されている内容を、再確認してみてください。


ありがちな話としては、レコード内に日付型の列が存在していた場合というのがあります。

特に指定しないと、日付型がなぜか OleDb.OleDbType.Date にマッピングされるため、
時刻部が切り捨てられてしまい、その結果、本来の目的の行を検出できないというものです。
(パラメータを OleDb.OleDbType.DBDate に変更すれば動作するようになります)
引用返信 編集キー/
■5258 / inTopicNo.4)  Re[2]: mdb(oleb)の更新ができない
□投稿者/ hikaru (17回)-(2007/07/09(Mon) 13:15:35)
No5254 (片桐 さん) に返信

片桐さん、ありがとうございます。
では、データセット、データテーブルびセットするところからの記述内容です。
なにとぞ、よろしくお願いします。お力をおかしください。

//SQL文の作成
selSql = "SELECT * FROM 管理テーブル";

//データアダプタの作成
da4 = new System.Data.OleDb.OleDbDataAdapter(selSql, cn4);

//データセットへの読み込み
ds4 = new DataSet(name);
da4.Fill(ds4, name);
//データテーブル
dt4 = ds4.Tables[name];

System.Data.OleDb.OleDbCommand cmd3;
System.Data.OleDb.OleDbCommand cmd4;
System.Data.OleDb.OleDbCommand cmd5;

//プライマリーキーの設定
dt4.PrimaryKey = new DataColumn[] { dt4.Columns["識別"], dt4.Columns["名称"] };
//SQL文の作成
insSql = "INSERT INTO 管理テーブル (識別,名称) VALUES (?,?)";
//コマンド作成
cmd3 = new System.Data.OleDb.OleDbCommand(insSql, cn4);
cmd3.Parameters.Add(new System.Data.OleDb.OleDbParameter("識別",      System.Data.OleDb.OleDbType.VarChar, 4, "識別"));
cmd3.Parameters.Add(new System.Data.OleDb.OleDbParameter("名称", System.Data.OleDb.OleDbType.VarChar, 60, "名称"));
da4.InsertCommand = cmd3; 

//SQL文の作成
delSql = "DELETE FROM 管理テーブル WHERE 識別=? AND 名称=?";
//コマンド作成
cmd4 = new System.Data.OleDb.OleDbCommand(delSql, cn4);
cmd4.Parameters.Add(new System.Data.OleDb.OleDbParameter("識別", System.Data.OleDb.OleDbType.VarChar, 4, "識別"));
cmd4.Parameters.Add(new System.Data.OleDb.OleDbParameter("名称", System.Data.OleDb.OleDbType.VarChar, 60, "名称"));
da4.DeleteCommand = cmd4;

//SQL文の作成
upSql = "UPDATE 管理テーブル SET 識別=?,名称=? WHERE 識別=? AND 名称=?";
//コマンド作成
cmd5 = new System.Data.OleDb.OleDbCommand(upSql, cn4);
cmd5.Parameters.Add(new System.Data.OleDb.OleDbParameter("識別", System.Data.OleDb.OleDbType.VarChar, 4, "識別"));
cmd5.Parameters.Add(new System.Data.OleDb.OleDbParameter("名称", System.Data.OleDb.OleDbType.VarChar, 60, "名称"));
da4.UpdateCommand = cmd5;

for (int i = 0; i < dt4.Rows.Count; i++)
{
if (ds4.Tables["管理テーブル"].Rows[i]["識別"].ToString() == "name")
{
ds4.Tables["ユーザ管理テーブル"].Rows[i]["識別"] = "name";
ds4.Tables["管理テーブル"].Rows[i]["名称"] = "顧客データ";
ds4.Tables["ユーザ管理テーブル"].Rows[i].EndEdit();
}
}
da4.Update(ds4, "管理テーブル");






> 更新先テーブルの構成はどうなっていますでしょうか?
>
> テーブルの主キーは?
> 列とタイプは?
> どうやってデータセットに入れたんでしょうか?
>
> もう少し情報をいただけると皆さんが助かるかと……
> よろしくお願いします。
引用返信 編集キー/
■5262 / inTopicNo.5)  Re[3]: mdb(oleb)の更新ができない
□投稿者/ はつね (201回)-(2007/07/09(Mon) 13:30:30)
はつね さんの Web サイト
No5258 (hikaru さん) に返信
> //SQL文の作成
> upSql = "UPDATE 管理テーブル SET 識別=?,名称=? WHERE 識別=? AND 名称=?";
> //コマンド作成
> cmd5 = new System.Data.OleDb.OleDbCommand(upSql, cn4);
> cmd5.Parameters.Add(new System.Data.OleDb.OleDbParameter("識別", System.Data.OleDb.OleDbType.VarChar, 4, "識別"));
> cmd5.Parameters.Add(new System.Data.OleDb.OleDbParameter("名称", System.Data.OleDb.OleDbType.VarChar, 60, "名称"));
> da4.UpdateCommand = cmd5;

想定1:
SQL文中の?の数とcmd5のParametersの要素数が異なっていますが、System.Data.OleDbクラスライブラリって異なってOKでしたっけ?
WHERE句にある?部分に相当するものが渡されていないために、WHERE句が成立しないとか

想定2:
WHERE句の?には、DataSetの現在値ではなくてDataSetに読み込んだときの値が必要なはず。
よって、DataSetに読み込んだときの値を渡すようにしたものを、さらにParameters.Addする必要があるはず。

引用返信 編集キー/
■5266 / inTopicNo.6)  Re[3]: mdb(oleb)の更新ができない
□投稿者/ 魔界の仮面弁士 (332回)-(2007/07/09(Mon) 14:20:12)
No5258 (hikaru さん) に返信

サンプルで使われているテーブルの定義は、どのようなものでしょうか?

> ds4.Tables["ユーザ管理テーブル"].Rows[i]["識別"] = "name";
> ds4.Tables["管理テーブル"].Rows[i]["名称"] = "顧客データ";
> ds4.Tables["ユーザ管理テーブル"].Rows[i].EndEdit();
「ユーザ管理テーブル」と「管理テーブル」が混在しているようですが、
この部分のソースに問題は無いですか?

で。提示されたソースを実験したところ、
 『1 つ以上の必要なパラメータの値が設定されていません。』
が発生し、
 『同時実行違反 : UpdateCommand によって、処理予定の 1 レコードのうち 0 件が処理されました。』
は発生しませんでした。


> //SQL文の作成
> upSql = "UPDATE 管理テーブル SET 識別=?,名称=? WHERE 識別=? AND 名称=?";
> //コマンド作成
> cmd5 = new System.Data.OleDb.OleDbCommand(upSql, cn4);
> cmd5.Parameters.Add(new System.Data.OleDb.OleDbParameter("識別", System.Data.OleDb.OleDbType.VarChar, 4, "識別"));
> cmd5.Parameters.Add(new System.Data.OleDb.OleDbParameter("名称", System.Data.OleDb.OleDbType.VarChar, 60, "名称"));
> da4.UpdateCommand = cmd5;

上記の部分を下記のように書き換えたところ、データが更新されました。

//SQL文の作成
upSql = @"PARAMETERS [新識別] TEXT, [新名称] TEXT, [旧識別] TEXT, [旧名称] TEXT;
UPDATE 管理テーブル SET 識別=[新識別],名称=[新名称]
WHERE 識別=[旧識別] AND 名称=[旧名称]";
//コマンド作成
cmd5 = new System.Data.OleDb.OleDbCommand(upSql, cn4);
cmd5.Parameters.Add(new OleDbParameter("新識別", OleDbType.VarChar, 4,
ParameterDirection.Input, false, 0, 0, "識別", DataRowVersion.Current, null));
cmd5.Parameters.Add(new OleDbParameter("新名称", OleDbType.VarChar, 60,
ParameterDirection.Input, false, 0, 0, "名称", DataRowVersion.Current, null));
cmd5.Parameters.Add(new OleDbParameter("旧識別", OleDbType.VarChar, 4,
ParameterDirection.Input, false, 0, 0, "識別", DataRowVersion.Original, null));
cmd5.Parameters.Add(new OleDbParameter("旧名称", OleDbType.VarChar, 60,
ParameterDirection.Input, false, 0, 0, "名称", DataRowVersion.Original, null));
da4.UpdateCommand = cmd5;
引用返信 編集キー/
■5267 / inTopicNo.7)  Re[2]: mdb(oleb)の更新ができない
□投稿者/ hikaru (18回)-(2007/07/09(Mon) 14:22:07)
はつねさん、ありがとうございます。
質問させていただいてよろしいでしょうか?

想定2:のことで
DataSetに読み込んだときの値を渡すようにしたものを、さらにParameters.Addする必要があるはず。
ということですが、Parametersで、値を渡すにはどのようにすればいいのでしょうか?
教えていただけるとありがたいです。




引用返信 編集キー/
■5275 / inTopicNo.8)  Re[3]: mdb(oleb)の更新ができない
□投稿者/ はつね (202回)-(2007/07/09(Mon) 14:48:43)
はつね さんの Web サイト
2007/07/09(Mon) 14:49:45 編集(投稿者)

No5267 (hikaru さん) に返信
> 想定2:のことで
> DataSetに読み込んだときの値を渡すようにしたものを、さらにParameters.Addする必要があるはず。
> ということですが、Parametersで、値を渡すにはどのようにすればいいのでしょうか?
> 教えていただけるとありがたいです。

魔界の仮面弁士さんがズバリ!なコードをかいてくれていますよ。

[追記]
DELETE文についてもOriginalな方を指定しないとダメですね。
#こちらは、Originalな方だけ。

引用返信 編集キー/
■5282 / inTopicNo.9)  Re[4]: mdb(oleb)の更新ができない
□投稿者/ hikaru (20回)-(2007/07/09(Mon) 16:01:18)
魔界の仮面弁士さん、はつねさん、ありがとうございました。
無事、更新処理が完成しました。

upSql = @"PARAMETERS [新識別] TEXT, [新名称] TEXT, [旧識別] TEXT, [旧名称] TEXT;
は、はじめて目にしました。
以前にも色々とお世話になりました。ありがとうございます。

また、質問することもあるかもしれませんが、よろしくお願いいたします。
引用返信 編集キー/
■5290 / inTopicNo.10)  Re[5]: mdb(oleb)の更新ができない
□投稿者/ 魔界の仮面弁士 (333回)-(2007/07/09(Mon) 19:36:42)
No5282 (hikaru さん) に返信
> 無事、更新処理が完成しました。
[解決済み]のチェックもよろしく。m(_ _)m


> upSql = @"PARAMETERS [新識別] TEXT, [新名称] TEXT, [旧識別] TEXT, [旧名称] TEXT;
> は、はじめて目にしました。

これですね。PARAMETERS は、ACE (JET) 固有の SQL コマンドです。

[PARAMETERS 宣言]
http://office.microsoft.com/ja-jp/access/HP010322601041.aspx

# Access のクエリデザイナの場合は、[クエリ パラメータ]ダイアログで設定されます。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -