none
なぜにGetChanges→TableAdapter.Update→AcceptChanges() RRS feed

  • 質問

  • いつもお世話になっております。
    いま勉強している参考書では、親と子(DataGridView)のデータを更新するときに

    1.Delete処理
     Subテーブルの処理
      変数 = DataSet.DataTable.GetChanges(DataRowState.○○○)
      TableAdapter.Update(変数)
      変数.Dispose()

     Mainテーブルの処理
      変数 = DataSet.DataTable.GetChanges(DataRowState.○○○)
      TableAdapter.Update(変数)
      変数.Dispose()

    2.Insert処理
     Mainテーブルの処理 
     Subテーブルの処理
     ※ コードの内容はDeleteのときと同じ

    3.Update処理
     1.サブ側のテーブルを更新 GetChanges→AcceptChanges→Dispose
     2.メイン側に対する、サブ側のレコードを削除 Delete
     3.後でもとに戻すサブ側の行のコピーを作成 copy
     4.サブ側のテーブルを更新 TableAdapter.Update
     5.メイン側のテーブルを更新 TableAdapter.Update
     6.サブ側の削除したレコードを元に戻す SetAdded→Merge
     7.サブ側のテーブルを更新 TableAdapter.Update

    としてから、それぞれメインテーブルとサブテーブルを改めてAcceptChangesしています。
    ですがこれは、こんな面倒な処理をせずに、素直にそれぞれのテーブルに
    TableAdapter.Updateではダメなのですか?

    すなおにTableAdapter.Updateを行う場合と、このように
    GetChanges→TableAdapter.Update→AcceptChanges()
    にする判断はどうやって行うのでしょうか?

    ご教示よろしくお願いいたします。
    2010年3月17日 13:50

回答

  • 単にTableAdapter.Update()を行なった場合、挿入、更新、削除が行なわれます。これらの順序はちょっと覚えていませんが、とにかくこれら3種類の処理を全て行なおうとします。
    しかし、これではまずい場合があります。参照整合性が崩れないようにテーブルを操作しなければならない場合があります。例は以下を参考にして下さい。一言で言えば、挿入、更新、削除の順序を自分でコントロールしたい場合、GetChangesで制御します。

    (参考)
    方法 : TableAdapter を使用してデータを更新する
    http://msdn.microsoft.com/ja-jp/library/ms171933(VS.80).aspx

    ちなみに、このような順序を制御できるTableAdapterManagerが、VS2008で追加されました。

    TableAdapterManager の概要
    http://msdn.microsoft.com/ja-jp/library/bb384426.aspx


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年3月17日 15:46
    モデレータ
  • TableAdapterManagerが使えるところであれば、GetChangesを無理に使う必要はないでしょう。しかし、GetChangesは決してobsolete(旧形式でもう使わない)ではありません。GetChangesを覚えておいて損はないでしょう。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク kei_chan_gt 2010年3月20日 15:35
    • 回答としてマーク kei_chan_gt 2010年3月20日 15:36
    2010年3月19日 15:04
    モデレータ

すべての返信

  • 単にTableAdapter.Update()を行なった場合、挿入、更新、削除が行なわれます。これらの順序はちょっと覚えていませんが、とにかくこれら3種類の処理を全て行なおうとします。
    しかし、これではまずい場合があります。参照整合性が崩れないようにテーブルを操作しなければならない場合があります。例は以下を参考にして下さい。一言で言えば、挿入、更新、削除の順序を自分でコントロールしたい場合、GetChangesで制御します。

    (参考)
    方法 : TableAdapter を使用してデータを更新する
    http://msdn.microsoft.com/ja-jp/library/ms171933(VS.80).aspx

    ちなみに、このような順序を制御できるTableAdapterManagerが、VS2008で追加されました。

    TableAdapterManager の概要
    http://msdn.microsoft.com/ja-jp/library/bb384426.aspx


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年3月17日 15:46
    モデレータ
  • trapemiyaさま

    いつもお世話になっております。
    VS2008からTableAdapterの順序を制御できるようですが、
    とすると、2008からはGetChangesは必要なくなるのでしょうか?

    2010年3月19日 11:15
  • TableAdapterManagerが使えるところであれば、GetChangesを無理に使う必要はないでしょう。しかし、GetChangesは決してobsolete(旧形式でもう使わない)ではありません。GetChangesを覚えておいて損はないでしょう。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク kei_chan_gt 2010年3月20日 15:35
    • 回答としてマーク kei_chan_gt 2010年3月20日 15:36
    2010年3月19日 15:04
    モデレータ
  • trapemiyaさま

    お世話になります<(_)>

    確かにいくらVB2008ではTableAdapterManagerが使えるようになったかと言っても
    まだまだGetChangesも使い道はありそうです。

    がんばってこれらの使い道を習得していきたいと思います。
    ありがとうございました。

    2010年3月20日 15:35