2017-01-19 4 views
0

異なるIDを持つ同じIDをデータベースに挿入したいとします。基本的には、ユーザーがいくつかの基準で新しい奨学金を追加できる形式です。すべてのコースにすべての奨学金が適用されるわけではありません。したがって、新しい奨学金を受けるscholarshipと、コースの資格を扱うscholarshipCourseという2つのテーブルがあります。異なるIDを持つ同じIDがデータベースに挿入されています

両方のデータを同時に挿入したいとします。

scholashipCourse

scholarship_id course 
------------------------- 
    1    math 
    1    english 
    2    english 
    2    science 

表をユーザープレスが提出場所scholarshipcourseテーブルが新しい奨学金のIDを取得し、例えば

を挿入します一方、scholarship表中の奨学金IDが自動インクリメントされますscholarship

scholarship_id  scholarshipName 
-------------------------------------- 
     1   moon scholarship 
     2   star scholarship 
     3   light scholarship 

scholarship_id 3が新しく追加されたscholarsh IP、どのように私はそのIDを取得し、scholarshipcourseテーブルに同時に挿入するのですか?

私は、このselect文を使用することができます

INSERT INTO user (name) 
VALUES ('John Smith'); 

INSERT INTO user_details (id, weight, height) 
VALUES (SELECT(id FROM user WHERE name = 'John Smith'), 83, 185); 

をどのように私はちょうど追加された最新のIDを取得できますか?

私はのように私のDALに挿入する必要があります:それは成功した二つのテーブルに追加されますが、それは取得しません {

 SqlCommand cmd = new SqlCommand(); 
     SqlConnection myConnection = new SqlConnection(strConnectionString); 

     cmd.Connection = conn; 
     cmd.CommandText = "INSERT INTO Table1(schName) values (@schName)"; 
     cmd.Parameters.AddWithValue("@schName", name); 
     conn.Open(); 
     int i = cmd.ExecuteNonQuery(); 
     int id = (int)cmd.ExecuteScalar(); 

     cmd.CommandText = "Select SCOPE_IDENTITY();INSERT INTO Table2(ScholarshipID,DiplomaCourse) values (@id,@course)"; 
     cmd.Parameters.AddWithValue("@id", id); 
     cmd.Parameters.AddWithValue("@course", course); 


     SqlDataAdapter da = new SqlDataAdapter(); 
     da.SelectCommand = cmd; 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 
     return dt; 

    } 

公共のDataTableテスト(文字列名、文字列コース)最後のIDとテーブルに挿入

+0

はあなたがいないSCOPE_IDENTITYする値です設定することができます 複数の詳細行を挿入したい場合 - あなたは、同時にそれを行うことはできません - - 奨学金の表にそれを挿入し、IDを取得してコーステーブルに挿入します。 – Hogan

+0

新しい奨学金を追加した後、IDを取得してコーステーブルに挿入しますか? – skylight

答えて

1

SCOPE_IDENTITY可能な解決策です。 SCOPE_IDENTITYの

説明:https://msdn.microsoft.com/en-us/library/ms190315.aspx

基本的には、奨学金のテーブルに挿入し、(SCOPE_IDENTITYで)IDを取得します。次に、そのIDを使用して、scholarshipCourseテーブルに挿入します。このような何か(奨学金のテーブル名に基づいて):

DECLARE @id INT 
INSERT INTO scholarshipCourse (course) VALUES ('humanities') 
SELECT @id = SCOPE_IDENTITY() --RETRIEVES THE LAST INSERTED ID IN THIS SCOPE 
INSERT INTO scholarship (scholarship_id, scholarshipName) VALUES (@id, 'star scholarship') 
+0

私は前にscope_identityを使ってnvrを試してみました。それは私にとって新しいものです。それ以外の方法はありますか? – skylight

+0

SCOPE_IDENTITYはかなり標準的で推奨されています。 @@ IDENTITYも可能ですが、SCOPE_IDENTITYを推奨します。 –

+0

質問を更新しました。私は可能なサンプルコードを私の答えに加えました。 –

0

あなたはID値を含め、新たに挿入されたレコードの値をキャプチャするOUTPUT句を使用することができます。

INSERT INTO user (name) 
OUTPUT INSERTED.ID 
VALUES ('John Smith'); 

INSERT声明挿入された各レコードのIDを含む結果セットを生成します(上記の場合は、単一の行)。クエリを実行するときにコマンドを実行することができます(たとえば、1行を挿入する場合はSqlCommand.ExecuteScalarを使用)。

0

インライン選択文をscope_identity関数に置き換えてください。

INSERT INTO user (name) VALUES ('John Smith'); 
INSERT INTO user_details (id, weight, height) VALUES (scope_identity(), 83, 185); 

、あなたが変数を宣言し、それが

INSERT INTO user (name) VALUES ('John Smith'); 
declare @id int 
select @id=scope_identity() 
INSERT INTO user (name) VALUES ('John Smith'); 
INSERT INTO user_details (id, weight, height) VALUES (@id, 83, 185); 
INSERT INTO user_details (id, weight, height) VALUES (@id, 84, 186); 
+0

なぜここにユーザーテーブルがありますか?ユーザーのテーブルとユーザーの詳細はこの質問とは関係がありません。別の質問の回答をコピーして編集したように見えます。 – Hogan

+0

完全な質問を最初に読んで、彼が底に置いた例を見てください! –

+0

私は訂正しました – Hogan

関連する問題