2017-01-16 34 views
-1

我想添加配料到配方中。爲了做到這一點,我嘗試過很多事情,但這並不令人傷心。 理念:http://prntscr.com/dw8lom 我的數據庫表:http://prntscr.com/dw8ms7C#我想要將配料粘貼到帶有數據庫的列表框中的配方

我的代碼我用來添加配方:

private void VoegReceptenToe() 
    { 
     string query = "INSERT INTO Recipe VALUES (@RecipeName, 30, 'goed mixen')"; 

     using (connection = new SqlConnection(connectionstring)) 
     using (SqlCommand command = new SqlCommand(query, connection)) 

     { 
      connection.Open(); 
      command.Parameters.AddWithValue("@RecipeName", txtRecipeName.Text); 
      command.ExecuteScalar(); 
      PopulateRecipes(); 

     } 

    } 

填充配方:

{ 
     string query = "SELECT a.Name FROM Ingredient a " + 
      "INNER JOIN Recipe_Ingredient b ON a.Id = b.IngredientId " + 
      "WHERE b.RecipeId = @RecipeId"; 
     // de connectionstring hoef je niet te openen en te sluiten als, 
     // je een using statement gebruikt, dat doet hij vanzelf. 
     using (connection = new SqlConnection(connectionstring)) 
     using (SqlCommand command = new SqlCommand(query,connection)) 
     using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
     { 
      command.Parameters.AddWithValue("@RecipeId", lstRecipe.SelectedValue); 

      DataTable ingredientTable = new DataTable(); 
      adapter.Fill(ingredientTable); 
      //Dit displayt de listbox. 
      lstIngredient.DisplayMember = "Name"; 
      lstIngredient.ValueMember = "id"; 
      lstIngredient.DataSource = ingredientTable; 
     } 
    } 
+1

「不起作用」是什麼意思?你的代碼有什麼問題?不在數據庫中插入配方?拋出任何異常?... – Pikoh

+0

感謝您的回覆, 由於它沒有工作,我的意思是;我已經嘗試了以下代碼: private void VoegIngredientenToe() { string query =「INSERT INTO Ingredient VALUES(@IredredName)」; (連接字符串) 使用(SqlCommand命令=新的SqlCommand(查詢,連接)) connection.Open(); command.Parameters.AddWithValue(「@ IngredientName」,textBox1.Text); 命令。的ExecuteScalar(); PopulateRecipes(); } } – overflowit

+0

@PaulF我不能將配料添加到新配方中。例如食譜:「nieuwtest」我已經通過使用文本框的值創建並將該值插入到listbox1。但我無法爲成分做到這一點,並將其添加到新的「配方」中。 – overflowit

回答

0

您正在打開到數據庫的新連接在關閉現有的之前。

代碼中會發生什麼情況是,當執行進入方法VoegReceptenToe時,它會打開一個到數據庫的新連接來插入一些數據。但是,在關閉該連接之前,您要調用PopulateRecipes方法,該方法將打開與數據庫的新連接。

你必須做的是分裂插件和查詢操作,並可以通過移動方式做到這一點VoegReceptenToeusing語句後:

private void VoegReceptenToe() 
{ 
    string query = "INSERT INTO Recipe VALUES (@RecipeName, 30, 'goed mixen')"; 

    using (connection = new SqlConnection(connectionstring)) 
    using (SqlCommand command = new SqlCommand(query, connection)) 
    { 
     connection.Open(); 
     command.Parameters.AddWithValue("@RecipeName", txtRecipeName.Text); 
     command.ExecuteScalar(); 
    } 
    PopulateRecipes(); 
} 
+0

謝謝,改變了它。但我仍然停留在配料部分。 :-( – overflowit

0

只要你確保配方&成分名(可能使用唯一索引)&您已確保配方名稱&成分名稱存在於表格中(例如,通過僅從您的列表框中進行選擇),那麼以下查詢可以做你想做的事:

INSERT INTO Recipe_Ingredient (RecipeID, IngredientID) 
VALUES (
SELECT ID FROM Recipe Where Name = @RecipeName, 
SELECT ID FROM Ingredient Where Name = @IngredientName) 

此插入一個進入Recipe_Ingredient表,由RecipeName中&的IngredientName的ID的,只要存在用於每一個單個條目。

您將需要爲RecipeName & IngredientName添加參數到您的命令並運行ExecuteNonQuery方法,因爲INSERT不返回值。

同樣添加一個新的RecipeName中ExecuteNonQuery方法應該用來運行此查詢:

INSERT INTO Recipe (Name, PrepTime, Instructions) VALUES (@RecipeName, 30, 'goed mixen') 

和新成分

INSERT INTO Ingredient (Name) VALUES (@Ingredient) 

而且注意你的代碼RePierre的重新排序,以確保連接不會過早關閉。

+0

我試圖將查詢應用到我的應用程序,但我仍然沒有設法做到這一點:-(沒有快速回復,因爲我認爲我可以弄明白(不))。 – overflowit

+0

你能顯示你的修改後的代碼 - 你也檢查錯誤,如果是的話報告。 – PaulF

+0

謝謝你的幫助!!對不起,我遲到的反應:D!我太固執了,我不得不解決這個問題,我沒有反應:D。我做的是,在這種情況下創建另一個列表框3,將此表與這些表成分綁定並添加一個多重事件!現在我唯一想到的就是如何使用我的刪除按鈕進行內部聯接的xD。 – overflowit

相關問題