リレーション関係にあるDataTableでデータベース更新する場合の注意点

  親子のリレーション関係にある DataTable で、データベースを更新する場合、以下の注意が必要となります。
  非接続型データである DataTablel に自動インクリメント列があり、この列が親子のリレーション関係にある場合は、次の点に注意してデータベースの更新を行って下さい。

(1) データ取得時
   ・親子のそれぞれの DataTable は同一の DataSet 内に生成します。
   ・親子相互のリレーション情報は DataSet の「Relations」プロパティに追加登録します。
   ・親の自動インクリメント列の初期値・増分値は、「追加更新の為の自動インクリメントの設定方法」を参考にして設定します。

(2) データ登録時
   ・データベースに登録する時は、追加・削除情報については以下の順序で行います。
     追加:自動インクリメント列を持つ親 DataTable を先に登録します。これにより仮設定された列の値が先に確定し、
         リレーション先の子 DataTable の列に自動的に反映されます。
【サンプル C#】

DataTable 内では一時的にユニークな仮番号を設定するサンプル
  //データ取得時
  //リレーションの設定
  ds.Relations.Add("リレーション名", 親DataColumnオブジェクト, 子DataColumnオブジェクト);


  //データ登録時
 //ds       DataSet
  //daParent DataAdapter
  //dsChild  DataAdapter
  //更新
  daChild.Update(ds.Tables["子"].Select( null, null, DataViewRowState.ModifiedCurrent));
  daParent.Update(ds.Tables["親"].Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent));
  //削除
  daChild.Update(ds.Tables["子"].Select(Nothing, Nothing, DataViewRowState.Deleted));
  daParent.Update(ds.Tables["親"].Select(Nothing, Nothing, DataViewRowState.Deleted));
  //追加
  daList.Update(ds.Tables["親"].Select(Nothing, Nothing, DataViewRowState.Added));
  daParent.Update(ds.Tables["子"].Select(Nothing, Nothing, DataViewRowState.Added));
戻る