C#我想将配料与数据库绑定到列表框中的配方中

时间:2017-01-16 09:55:30

标签: c# sql database listbox

我想在食谱中添加成分。为了做到这一点,我尝试过很多东西,但它并没有让人伤心。 想法:http://prntscr.com/dw8lom 我的数据库表:http://prntscr.com/dw8ms7

我的代码我曾用过添加食谱:

   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;
        }
    }

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

只要你确保Recipe&成分名称在其表格中是唯一的(可能使用独特的索引)&你确定了RecipeName&表格中存在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&的ID组成。只要每个都有一个条目,就可以使用IngredientName。

您需要为RecipeName和amp;添加参数。您的命令的IngredientName并运行ExecuteNonQuery方法,因为INSERT不返回值。

与添加新的RecipeName类似,应该使用ExecuteNonQuery方法来运行此查询:

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

和新的成分

INSERT INTO Ingredient (Name) VALUES (@Ingredient)

另请注意RePierre重新排序您的代码,以确保连接不会过早关闭。