2017-01-16 1 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(); 

     } 

    } 

рецепт Populate:

{ 
     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 INCERT IN VALUES (@IngredientName)"; using (connection = new SqlConnection (connectionstring)) using (SqlCommand command = new SqlCommand (запрос, соединение)) { connection.Open(); command.Parameters.AddWithValue ("@ IngredientName", textBox1.Text); команда.ExecuteScalar(); PopulateRecipes(); } } – overflowit

+0

@PaulF Я не могу добавить ингредиент к новому рецепту. Например, рецепт: «nieuwtest», который я создал, используя значение текстового поля и вставляя это значение в списокbox1. Но я не могу сделать это для ингредиентов и добавить его в новый «Рецепт». – overflowit

ответ

0

Вы открываете новое подключение к базе данных перед закрытием существующего.

Что происходит в вашем коде, так это то, что при запуске метода VoegReceptenToe он открывает новое соединение с базой данных для вставки некоторых данных. Однако перед закрытием этого соединения вы вызываете метод PopulateRecipes, который открывает новое соединение с базой данных.

То, что вы должны сделать, это разделить вставки и запроса операции, и вы можете сделать это путем перемещения метода VoegReceptenToeпослеusing заявление:

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

Пока вы убедитесь, что рецепт & имена Ингредиент уникальны в своих таблицах (возможно, используя уникальный индекс) & вы уверены, что в таблицах существует имя рецепта & IngredientName (например, только выбрав из ваших списков), тогда следующий запрос может сделать то, что вы хотите:

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 тех пор, пока существует одна записи для каждого.

Вам нужно будет добавить параметры как для параметра 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. Что я сделал, сделайте еще один список, поэтому в этом случае listbox 3 свяжите это с ингредиентами таблицы и добавьте multiclickevent! Единственное, что я выясняю сейчас, это то, как я использую кнопку delete для внутреннего соединения XD. – overflowit