例を挙げて問題を説明します。
私のデータベースには、entry、tagsという名前の2つのテーブルがあります
両方のテーブルにID_ENTRYという名前の列があります。テーブルエントリにレコードを追加するときは、最後に追加されたレコードのID_ENTRYを取得して、テーブルタグに追加する必要があります。どうすればいいですか?
例を挙げて問題を説明します。
私のデータベースには、entry、tagsという名前の2つのテーブルがあります
両方のテーブルにID_ENTRYという名前の列があります。テーブルエントリにレコードを追加するときは、最後に追加されたレコードのID_ENTRYを取得して、テーブルタグに追加する必要があります。どうすればいいですか?
これを行う唯一の方法は、複数のステートメントを使用することです。動的SQLを使用すると、クエリ文字列の各ステートメントをセミコロンで区切ることでこれを行うことができます。
"DECLARE @ID int;INSERT INTO [Entry] (...) VALUES ...; SELECT @ID = scope_identity();INSERT INTO [TAGS] (ID_ENTRY) VALUES (@ID);"
並行性の問題から保護し、すべてをアトミックに保つために、これをトランザクションに入れるようにしてください。必要に応じて、これを2つの個別のクエリに分割して、途中で新しいID値を返すこともできます。両方のクエリが同じトランザクションにあることを確認してください。
また、動的SQLでパラメーター化されたクエリを使用していますよね?そうでなければ、私は個人的にそこに来て、あなたが不安な道を悔い改めるまで、濡れた麺であなたを10,000回叩きます。
タグテーブルにプッシュする必要のあるすべてのデータが利用可能な場合は、名前付きエントリテーブルでINSERTトリガーを使用してこれを行う可能性があります。そうでない場合は、トランザクション内で両方を作成するストアドプロシージャの使用を検討することをお勧めします。
コードでそれを実行したい場合は、データの管理方法についてより具体的にする必要があります。DataAdapter、DataTables、LINQ、NHibernateなどを使用していますか?基本的に、挿入が実行されるか実行されないように、ある種のトランザクション内で両方の挿入をラップする必要がありますが、それを実行する手段は、データベースとの対話に使用しているテクノロジーによって異なります。
最初のテーブルで挿入ステートメントを実行した直後に、「SELECT@@identity」を実行して@@IDENTITYにクエリを実行する必要があります。これにより、最後に自動生成されたIDが取得され、2番目のテーブルに挿入されます。
トリガーまたは行を挿入するものを使用している場合...これは機能しない可能性があります。@@ IDENTITYの代わりにScope_Identity()を使用する
動的 SQL を使用する場合は、Linq to Entity Framework を使用しない理由はありません。Microsoft が推奨するデータ アクセス テクノロジは EF です ( ADO.NET チーム ブログの L2S Futures に関するこの投稿を参照してください)。最後のアイデンティティ ID が自動的に利用可能になります。簡単なので、私はいつもそれを使用しています。
お役に立てれば!
レイ。