2009-05-31 10 views
6

私はVBアプリケーションでADO.NETデータセットを使用しています。私は1つの親テーブルと多くの子テーブルを持つ型指定されたデータセットを持っています。親テーブルにデータを挿入し、同じキー(Foreginキーとして)を使用してすべての子テーブルのデータを更新すると、IDキーが生成されます。自動生成されたIDキーを使用してデータセットの親テーブルと子テーブルを更新するにはどうすればよいですか?

最後に、データベース(SQL Server08)のデータセットを更新したいと思います。

上記のことは、まずデータベースに直接親テーブルを挿入し、ID列を取得し、子テーブルに使用するよりも可能です。

しかし、私は自動運転とこれにしたい(DataContextの中でプライマリ&外部キーの世話をするLINQ to SQLは同様。)

I親と子のために自動生成された列の世話をデータセットで可能なものテーブル?

おかげで、

ABB

答えて

4

これはもっと明白でなければならないと思います。しかし、それでもかなり簡単です。子と親テーブル間のDataRelationを作成し、更新にカスケード接続するように設定し

  1. ソリューションは、2つの部分があります。 このようにして、親Idが変更されると、すべての子が更新されます。

    Dim rel = ds.Relations.Add(parentTab.Columns("Id"), childTab.Columns("ParentId")) 
    rel.ChildKeyConstraint.UpdateRule = Rule.Cascade 
    
  2. データセットの挿入と更新コマンドは、双方向である: 結合または任意のデータ行が返された出力パラメータがある場合、 それらは更新の原因となったデータセットの行を更新するために使用されるであろう。

    これは、この特定の問題に最も役立ちます。自動生成された列をアプリケーションに戻す IDとは別に、これは、例えばタイムスタンプ列であってもよい。 しかし、アイデンティティが最も役に立ちます。

    私たちが行う必要があるのは、identityを返すようにinsertコマンドを設定することだけです。例えば、

    のようないくつかの方法があります。a)出力パラメータ付きストアドプロシージャの使用。これは、「実際の」データベースの中で最も移植性の高い方法です。

    b)複数のSQL文を使用し、最後に挿入された行を戻します。中

    insert into Parent (Col1, Col2, ...) values (@Col1, @Col2, ...); 
    select * from Parent where Id = SCOPE_IDENTITY(); 
    

これを設定した後、あなたがする必要があるすべては(1つのデータセット内で)一意であるId sの親行を作成することですが、不可能:これは最も単純なSQL Serverへの私の知る限り、特定のですが、データベース。通常はマイナスの数字が良い選択です。次に、データセットの変更をデータベースに保存すると、新しい親行はすべてデータベースから実際にIdになります。


注:複数のステートメントのサポートがなく、ストアドプロシージャ(例えばアクセス)することなく、データベースで動作するように起こる場合は、親テーブルアダプタでRowUpdatedイベントにセットアップイベントハンドラにする必要があります。あなたはselect @@IDENTITYコマンドで身元を取得する必要があります。


いくつかのリンク:物事の

3

カップルは指摘します。

  1. はい、どちらのテーブルにもリレーションシップが割り当てられている必要があります。 xsdエディタから確認できます(xsdファイルをダブルクリックしてください)。デフォルトでは、関係は「更新ルール」を持たない「関係のみ」として設定されます。この関係を編集関係に編集し、「外部キー制約のみ」または「両方~~~」を選択します。カスケードとして '更新ルール'を設定する必要があります。 「ルールの削除」はあなた次第です。

  2. 外部キーとして新しい子テーブルの行の新しい親テーブルの行ID(AutoIncrement)を使用すると、新しい親行のIDを使用する前に親テーブルをテーブルに追加する必要があります。

  3. tableadapterを使用して親テーブルのUpdateを呼び出すと、関連する子テーブルの新しい行は正しいparentID AUTOMATICALLYになります。

私の簡単なコードスニペット:

'--- Make Parent Row 
Dim drOrder as TOrderRow = myDS.TOder.NewTOrderRow 
drOrder.SomeValue = "SomeValue" 
myDS.TOrder.AddTOrderRow(drOrder) '===> THIS SHOULD BE DONE BEFORE CHILD ROWS 

'--- Now Add Child Rows!!! there are multiple ways to add a row into tables.... 
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailValue1") 
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailvalue2") 
'.... 
'.... 

'--- Update Parent table first 
myTableAdapterTOrder.Update(myDS.TOrder) 
'--- As soon as you run this Update above for parent, the new parent row's AutoID(-1) 
'--- will become real number given by SQL server. And also new rows in child table will 
'--- have the updated parentID 

'--- Now update child table 
myTableAdapterTOrderDetail.Update(myDS.TOrderDetail) 

私はそれが役に立てば幸い!