2016-04-12 8 views
0

私は謝罪しますが、この質問は多くポップアップしていますが、私はそのテーマについて読んだ答えを理解できず、私のために物事をクリアする。ジョイントとジャンクションテーブルを使用して複数のテーブルに挿入する

私は3つのテーブルがあります:私ので、言われていることを

Recipes (ID int primary identity, RecipeName varchar(20), Directions varchar(max), RecIngID int)

Ingredients (ID int primary identity, IngredientName varchar(30), Quantity int)

とジャンクションテーブル、今Recipe_Ingredients (RecipeID int foreign key references Recipe(ID), IngredientID int foreign key references Ingredient(ID)

を、私は(すべてのためのストアドプロシージャを作成する必要がありますasp.net MVC 4とC#を使用してntierプログラムを作成しています.........

しかし、テーブルに新しいレシピを挿入し、接合テーブルRecipe_IngredientsIngredientテーブルの関係を考慮に入れてストアドプロシージャを書く方法がわかりません。

誰かお願いします、よろしくお願いします。私が読んだすべての説明は本当に意味をなさない。私が間違っていることがあれば教えてください。各成分のため

+0

あなたは成分やレシピを挿入し、一時変数に各IDを保存する必要があります。次に、両方のIDをrecipe_ingredientsテーブルに挿入します。 – Carra

+0

SPですべてをやりたければ、おそらくデータ管理者のstackexchangeをチェックする方が良いでしょう。この前の回答を参照してください:[外部キーを含む行を挿入するにはどうすればいいですか?](http://dba.stackexchange.com/questions/46410/how-do-i-insert-a-row-which-contains- a-foreign-key)である。 – Igor

答えて

0

は、成分を挿入し、それが新たにIDを挿入します返しこのストアドプロシージャ

create procedure insertIngredients 
(
    @name varchar, 
    @quantity int 
) 
as 
insert into Ingredients (IngredientName, Quantity) 
values (@name, @quantity) 

select SCOPE_IDENTITY() 

を呼び出します。 そのIDを変数に格納します(Listまたはカンマ区切り文字列)。その後 、プロシージャを呼び出すレシピを挿入します。

create procedure insertRecipe 
(
    @name varchar, 
    @directions varchar(max), 
    @RecIngID int 
) 
as 
insert into Recipes (RecipeName, Directions, RecIngID) 
values (@name, @directions, @RecIngID) 

select SCOPE_IDENTITY() 

はまた、その手順は、挿入後に返すIDを保存します。 最後に、レシピIDと以前に挿入したすべての成分IDを使用して、接合テーブルにデータを挿入します。このようなあなたのC#のコードの呼び出し手順で

create procedure insertRecipeIngredients 
(
    @recipeID int, 
    @ingredientID int 
) 
as 
insert into Recipe_Ingredients (RecipeID, IngredientID) 
values (@recipeID, @ingredientID) 

select SCOPE_IDENTITY() 

public int InsertIngredient(string name, int quantity) 
{ 
    SqlConnection conn = new SqlConnection("[your connection string goes here]"); 

    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = conn; 
    cmd.CommandText = "insertIngredients"; 
    cmd.CommandType = CommandType.StoredProcedure; 

    cmd.Parameters.AddWithValue("@name", name); 
    cmd.Parameters.AddWithValue("@quantity", quantity); 

    conn.Open(); 

    int newlyInsertedId = (int) cmd.ExecuteScalar(); 

    if (conn.State == System.Data.ConnectionState.Open) 
    conn.Close(); 

    return newlyInsertedId; 
} 
+0

これは私のために多くのものをクリアします、ありがとう!私が残した唯一の疑問は、SPストアがその変数を次のSPに必要なものに戻す方法です。特に私はプログラム自体のDALとBLLに入るときは? 私はここで木々の森が欠落しているとお詫びしますが、SQLの学習には約4日間しかかかりませんでした。 : – SnarkyBird

+0

@SnarkyBird、編集された答えをチェックアウト、私はC#の例を追加し、それがあなたに役立つなら、答えとしてマーク;) – Nino

+0

大いに役立ったので、とても有難い! – SnarkyBird

関連する問題