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

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

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

Re[5]: tabaleadapterのupdateメソッドについて


(過去ログ 46 を表示中)

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

■24843 / inTopicNo.1)  tabaleadapterのupdateメソッドについて
  
□投稿者/ 気合 (24回)-(2008/09/10(Wed) 23:47:31)

分類:[ASP.NET (C#)] 

ASP.net c# 開発です。

解決せず困っていることがある為、お願い致します。
TableAdapterのUpdateメソッドを使用しDatasetの中身を丸ごとデータベースへアップしたいのですが、
Dataset内で



とある主キーとなるものを3を消して新たに3という主キーを追加する場合ですが結果的にDB上は主キー値は変わらないはずですが、一意制約違反となります。
私の考えではDataSetでは追加してから削除をしているのか・・・などなど思いつきますが、結果的に保存ができません。

どのようにしたらアップデートが成功するのかご教示願いたいです。
宜しくお願い致します。
引用返信 編集キー/
■24844 / inTopicNo.2)  Re[1]: tabaleadapterのupdateメソッドについて
□投稿者/ 魔界の仮面弁士 (845回)-(2008/09/10(Wed) 23:51:49)
No24843 (気合 さん) に返信
> ASP.net c# 開発です。
データベースは何ですか?

> 一意制約違反となります。
TableAdapter の SelectCommand, InsertCommand, UpdateCommand, DeleteCommand の SQL が、
どのように設定されているか、また、パラメータの型が適切であるかどうかを確認してみてください。
引用返信 編集キー/
■24846 / inTopicNo.3)  Re[2]: tabaleadapterのupdateメソッドについて
□投稿者/ 気合 (25回)-(2008/09/11(Thu) 00:19:43)
No24844 (魔界の仮面弁士 さん) に返信
> ■No24843 (気合 さん) に返信
>>ASP.net c# 開発です。
> データベースは何ですか?
>
>>一意制約違反となります。
> TableAdapter の SelectCommand, InsertCommand, UpdateCommand, DeleteCommand の SQL が、
> どのように設定されているか、また、パラメータの型が適切であるかどうかを確認してみてください。

返信有難うございます。
その確認ですが、updateメソッドに対してそのコマンドの設定って関係ありますか?
引用返信 編集キー/
■24847 / inTopicNo.4)  Re[3]: tabaleadapterのupdateメソッドについて
□投稿者/ ま (121回)-(2008/09/11(Thu) 01:05:34)
削除
コミット
インサート
コミット

又は

トランザクション開始
try {
削除
コミット
インサート
コミット
} catch(SQLException e) {
ロールバック
}
トランザクション終了

削除の後すぐインサートしてもダメ。
但し、オートコミットモードが設定可能な場合はその限りではありません。

>その確認ですが、updateメソッドに対してそのコマンドの設定って関係ありますか?
確認しろって指摘しているんだから、文句言わずに調べたらいいんじゃない?
関係あるかどうかわからんけどもそれらも含めて自分で検索してから返事しないと。


> データベースは何ですか?

これの回答も真っ先に行うべき。というか、スレ立てる前に開発環境の詳細を記述しておくべき。



引用返信 編集キー/
■24850 / inTopicNo.5)  Re[3]: tabaleadapterのupdateメソッドについて
□投稿者/ 魔界の仮面弁士 (846回)-(2008/09/11(Thu) 10:19:12)
2008/09/11(Thu) 11:26:18 編集(投稿者)

No24846 (気合 さん) に返信
>>> 一意制約違反となります。
>>TableAdapter の SelectCommand, InsertCommand, UpdateCommand, DeleteCommand の SQL が、
>>どのように設定されているか、また、パラメータの型が適切であるかどうかを確認してみてください。
> その確認ですが、updateメソッドに対してそのコマンドの設定って関係ありますか?

実際に関係あるかどうかは、気合さん自身に確認していただかないと分かりません。
あくまでも関係する可能性がある、というだけです。(だからこそ、逆質問しているわけで(^^;)

たとえば…Parameters で日付型と日付時刻型とを間違えて設定されていた場合、データの
時刻部が切り捨てられるため、該当データを正しく検出できず、更新が失敗する事があります。

あるいは、同時実行制御(optimistic / pessimistic)の扱いも重要です。
DELETE/UPDATE の WHERE 句の組み方によって、同時実行制御性が決まりますが、
この条件の組み方次第では、やはり更新に失敗する可能性がありえます。

なのでまずは、自動生成(あるいは手動変更)された更新クエリの確認と、Parameters 設定の
見極めが必要であろうということから、先の逆質問となった次第です。

あと、オートナンバー列の場合は、AutoIncrement の設定漏れにも注意が必要かも。


=== 以下追記 ===

TableAdapter で Update 系メソッドというと、以下の 3 種があるかと思いますが、
今回使っているのは、(1) のメソッドという事でよろしいですか?


(1) DataTable への編集結果を反映させるためのメソッド。
  tableAdapter.Update( [dataSet または DataTable] )
  tableAdapter.Update( [dataSet または DataTable], 引数1, 引数2, … )

(2) TableAdapter に追加登録したクエリにて更新させるメソッド。以下のような形式。
  tableAdapter.UpdateQuery1( )
  tableAdapter.UpdateQuery2( 引数1, 引数2, … )

(3) TableAdapter の GenerateDBDirectMethods プロパティによって自動生成されるメソッド。
  tableAdapter.Update( [DataRow または DataRow配列] )
  tableAdapter.Update( 列値1, 列値2, … )

--

(1)は、TableAdapter の InsertCommand, UpdateCommand, DeleteCommand プロパティの
SQL にて処理されるメソッドです。
これらは、DataSet/DataTable への編集結果を DB に反映させるために使われます。

(2) は、TableAdapter への追加クエリとして、CommandText に指定された
UPDATE SQLまたはストアドにて処理されるものです。
これらは、DataSet/DataTable を介さずに、直接更新するためのメソッドです。

(3) は、(1) で生成されたメソッドのオーバーロードとして自動生成されるもので、
DataSet/DataTable を介さずに、行単位での更新を可能にするメソッドです。
引用返信 編集キー/
■24873 / inTopicNo.6)  Re[4]: tabaleadapterのupdateメソッドについて
□投稿者/ 気合 (26回)-(2008/09/11(Thu) 14:54:31)
言葉足らずですみません
はい、(1)を使っております。
引数にdetasetのみ渡しております。
TableAdapter の InsertCommand, UpdateCommand, DeleteCommand
を確認しました
すべて主キーとしている番号をwhere句の後にいれてinsert update deleteをしております。
時間などは使用しておりませんでした。

内部でinsert してから deleteをしているので一意制約に引っかかるのでしょうか?

改善策がまだ分かりません。引き続きお力をお貸しください
引用返信 編集キー/
■24881 / inTopicNo.7)  Re[5]: tabaleadapterのupdateメソッドについて
□投稿者/ 魔界の仮面弁士 (850回)-(2008/09/11(Thu) 16:36:11)
結局データベースの種類は謎のまま。まぁ良いですけど。

No24873 (気合 さん) に返信
> 内部でinsert してから deleteをしているので一意制約に引っかかるのでしょうか?
新規行が削除行よりも上にある場合は、一意制約違反となりえます。
MSDN にも書かれていますように、各ステートメントはバッチ処理として
実行されるのではなく、各行が個別に更新される仕様になっているからです。

ですが通常の利用では、追加された行は末尾に配置されるケースが多いので、まず、
削除行(DataRowState.Deleted)や編集行(DataRowState.Modified)が先に処理されてから、
追加行(DataRowState.Added)が処理される事になるかと思います。

# このパターンにおいては、結果的に、一意制約違反にはなりにくいため、先ずは
# TableAdapter の設定確認をお願いした次第です。


どうしても削除を先に行いたいのであれば、DataSet.GetChanges を併用してください。

さすがに、主キー値を入れ替えた場合(下記コード)には対応できませんが、今回のように
主キーの削除と追加のみが目的なら、DataRowState.Deleted を先に処理しておくことで、
DataTable 単位で一括更新したとしても、更新する事ができるかと思います。


// ID=1 と ID=3 を入れ替える
DataRow row1 = ds.Table1.FindByID(1);
DataRow row3 = ds.Table1.FindByID(3);
ds.EnforceConstraints = false;
row1["ID"] = 3
row3["ID"] = 1
ds.EnforceConstraints = true;

tableAdapter1.Update(ds) // 一意制約違反
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -