1

私はデータベースにアクセスするためにasp.net 4とを使用します。DataSetsデータベースには、1対1の関係を持つ2つのテーブルがあります。これは、両方のテーブルが主キー(たとえば、Id)と同じ列を持ち、テーブルの1つが@identityこの列セットにあることを意味します。

id.table2 = idしたがって、一般に、挿入する場合は、table1の対応するレコードを使用して2番目のテーブルに挿入するよりも、最初に最初のテーブルに挿入します。

ストアドプロシージャを使用してこれを実現する方法を想像できます(最初のテーブルに挿入し、outパラメーターとしてidを使用してから、このIDを使用して2番目のテーブルに挿入します。すべて1つのトランザクション内にあります)。

しかし、ストアドプロシージャを使用せずにそれを行う方法はありますか?DataSets \ DataAdaptersにはそのような機能が組み込まれている可能性がありますか?

助けていただければ幸いです。

4

1 に答える 1

1

今日はここはとても静かです...誰かがそのような解決策も探しているなら、私はそれを行う方法を見つけました。

したがって、主な問題は、最初のテーブルで新しく作成されたレコードのIDを取得することです。それが可能であれば、その後、2番目のテーブルに対応するレコードを作成する次のメソッドにそれを提供するだけです。

VSのコード自動生成機能を楽しむために、DataSetDesignerを使用しました。最初のテーブルをTripSetsと呼びましょう。DataSet Designerで、TripSetsTableAdapterを右クリックし、次に[プロパティ]をクリックします。InsertCommandプロパティグループを展開します。ここでは、2つのことを行う必要があります。

まず、パラメータコレクションエディタを使用して、パラメータのコレクションに新しいパラメータを追加します。ParameterName = @ TripId、DbType = Int32(または必要なもの)、Direction=Outputを設定します。

次に、CommandTextを変更します(便宜上、クエリビルダーを使用します)。コマンドの最後に、次のようなセミコロンの後に別のコマンドを追加します。

(...);
SELECT @TripId = SCOPE_IDENTITY()

したがって、次のようなステートメントが得られます。

INSERT INTO TripSets 
(Date, UserId)
VALUES     
(@Date,@UserId);
SELECT @TripId = SCOPE_IDENTITY()

パーサーエラーの警告が表示される可能性がありますが、無視してかまいません。これを構成すると、ビジネスロジックコードで次のように使用できるようになります。

int tripId;        
int result = tripSetsTableAdapter.Insert(tripDate, userId, out tripId);

// Here comes the insert method into the second table

tripSetTripSearchTableAdapter.Insert(tripId, amountPersons);

おそらく、この操作を何らかの方法で同期させたいと思うでしょう(たとえば、TransactionScopeを使用して)が、それは完全にあなた次第です。

于 2011-07-03T14:46:17.843 に答える