【问题标题】:Looping parameterized query循环参数化查询
【发布时间】:2019-02-05 02:53:24
【问题描述】:

我一直在寻找它的解决方案一段时间,我在这里看到过类似的问题,但那里的答案并没有解决我的问题。在我的情况下,我想循环遍历 datagridview 值的行以将其插入 MySql 数据库。 datagridview 中的行数将取决于用户。当我尝试输入 2 行或更多行 datagridview 值并尝试将其插入数据库时​​,只有第一行数据插入成功。

这是我的代码:

MySqlCommand cmd = new MySqlCommand();
                cmd.Connection = SecurityMod.dbconn();
                for (int i = 0; i < dgv_ctrl.Rows.Count; i++)
                {
                    string sql = "INSERT INTO delivery(DeliveryNumber, CreationDate, Client, Product, Price, Quantity, Total) " +
                             "VALUES(@num_Delivery, " + "@dgv_datevalue" + ", " +
                             "@name_Client" + ", " +
                             "@name_Product" + ", " +
                             "@priceof_Produt" + ", " +
                             "@quan_Product" + ", " +
                             "@price_Total" + ");";

                    cmd.Parameters.AddWithValue("@num_Delivery", num_Delivery);
                    cmd.Parameters.AddWithValue("@dgv_datevalue", DateTime.Parse(dgv_ctrl.Rows[i].Cells["Creation_Date"].Value.ToString()).ToString("yyyy-MM-dd HH:mm:ss"));
                    cmd.Parameters.AddWithValue("@name_Client", dgv_ctrl.Rows[i].Cells["Client_name"].Value);
                    cmd.Parameters.AddWithValue("@name_Product", dgv_ctrl.Rows[i].Cells["Product_name"].Value);
                    cmd.Parameters.AddWithValue("@priceof_Produt", dgv_ctrl.Rows[i].Cells["Price_ofProduct"].Value);
                    cmd.Parameters.AddWithValue("@quan_Product", dgv_ctrl.Rows[i].Cells["Quantity_ofProduct"].Value);
                    cmd.Parameters.AddWithValue("@price_Total", dgv_ctrl.Rows[i].Cells["Total_Price"].Value);
                    cmd.CommandText = sql;
                    cmd.ExecuteNonQuery();

错误:已定义参数“@num_Delivery”。我是使用 C# 语言的新手。欢迎任何想法和建议。

【问题讨论】:

  • 您需要在添加第二行之前清除参数cmd.Parameters.Clear();
  • 为了确保我做对了,我会使用 cmd.Parameters.Clear();在 cmd.ExecuteNonQuery() 之后; ?
  • 在所有参数之前添加它

标签: c# mysql loops


【解决方案1】:

你可以这样做。它应该可以工作。

MySqlCommand cmd = new MySqlCommand();
cmd.Connection = SecurityMod.dbconn();
for (int i = 0; i < dgv_ctrl.Rows.Count; i++)
{
    string sql = "INSERT INTO delivery(DeliveryNumber, CreationDate, Client, Product, Price, Quantity, Total) " +
             "VALUES(@num_Delivery, " + "@dgv_datevalue" + ", " +
             "@name_Client" + ", " +
             "@name_Product" + ", " +
             "@priceof_Produt" + ", " +
             "@quan_Product" + ", " +
             "@price_Total" + ");";
    cmd.Parameter.Clear();
    cmd.Parameters.AddWithValue("@num_Delivery", num_Delivery);
    cmd.Parameters.AddWithValue("@dgv_datevalue", DateTime.Parse(dgv_ctrl.Rows[i].Cells["Creation_Date"].Value.ToString()).ToString("yyyy-MM-dd HH:mm:ss"));
    cmd.Parameters.AddWithValue("@name_Client", dgv_ctrl.Rows[i].Cells["Client_name"].Value);
    cmd.Parameters.AddWithValue("@name_Product", dgv_ctrl.Rows[i].Cells["Product_name"].Value);
    cmd.Parameters.AddWithValue("@priceof_Produt", dgv_ctrl.Rows[i].Cells["Price_ofProduct"].Value);
    cmd.Parameters.AddWithValue("@quan_Product", dgv_ctrl.Rows[i].Cells["Quantity_ofProduct"].Value);
    cmd.Parameters.AddWithValue("@price_Total", dgv_ctrl.Rows[i].Cells["Total_Price"].Value);
    cmd.CommandText = sql;
    cmd.ExecuteNonQuery();
}

【讨论】:

    【解决方案2】:

    移动

    MySqlCommand cmd = new MySqlCommand();
    

    for 循环中:

    string sql = "INSERT INTO delivery(DeliveryNumber, CreationDate, Client, Product, Price, Quantity, Total) " +
                 "VALUES(@num_Delivery, " + "@dgv_datevalue" + ", " +
                 "@name_Client" + ", " +
                 "@name_Product" + ", " +
                 "@priceof_Produt" + ", " +
                 "@quan_Product" + ", " +
                 "@price_Total" + ");";
    for (int i = 0; i < dgv_ctrl.Rows.Count; i++)
    {
        MySqlCommand cmd = new MySqlCommand();
        cmd.Connection = SecurityMod.dbconn();
        cmd.Parameters.AddWithValue("@num_Delivery", num_Delivery);
        cmd.Parameters.AddWithValue("@dgv_datevalue", DateTime.Parse(dgv_ctrl.Rows[i].Cells["Creation_Date"].Value.ToString()).ToString("yyyy-MM-dd HH:mm:ss"));
        cmd.Parameters.AddWithValue("@name_Client", dgv_ctrl.Rows[i].Cells["Client_name"].Value);
        cmd.Parameters.AddWithValue("@name_Product", dgv_ctrl.Rows[i].Cells["Product_name"].Value);
        cmd.Parameters.AddWithValue("@priceof_Produt", dgv_ctrl.Rows[i].Cells["Price_ofProduct"].Value);
        cmd.Parameters.AddWithValue("@quan_Product", dgv_ctrl.Rows[i].Cells["Quantity_ofProduct"].Value);
        cmd.Parameters.AddWithValue("@price_Total", dgv_ctrl.Rows[i].Cells["Total_Price"].Value);
        cmd.CommandText = sql;
        cmd.ExecuteNonQuery();
    }
    

    或清除其Parameters集合:

    string sql = "INSERT INTO delivery(DeliveryNumber, CreationDate, Client, Product, Price, Quantity, Total) " +
                 "VALUES(@num_Delivery, " + "@dgv_datevalue" + ", " +
                 "@name_Client" + ", " +
                 "@name_Product" + ", " +
                 "@priceof_Produt" + ", " +
                 "@quan_Product" + ", " +
                 "@price_Total" + ");";
    MySqlCommand cmd = new MySqlCommand();
    cmd.Connection = SecurityMod.dbconn();
    for (int i = 0; i < dgv_ctrl.Rows.Count; i++)
    {
        cmd.Parameters.Clear();
        cmd.Parameters.AddWithValue("@num_Delivery", num_Delivery);
        cmd.Parameters.AddWithValue("@dgv_datevalue", DateTime.Parse(dgv_ctrl.Rows[i].Cells["Creation_Date"].Value.ToString()).ToString("yyyy-MM-dd HH:mm:ss"));
        cmd.Parameters.AddWithValue("@name_Client", dgv_ctrl.Rows[i].Cells["Client_name"].Value);
        cmd.Parameters.AddWithValue("@name_Product", dgv_ctrl.Rows[i].Cells["Product_name"].Value);
        cmd.Parameters.AddWithValue("@priceof_Produt", dgv_ctrl.Rows[i].Cells["Price_ofProduct"].Value);
        cmd.Parameters.AddWithValue("@quan_Product", dgv_ctrl.Rows[i].Cells["Quantity_ofProduct"].Value);
        cmd.Parameters.AddWithValue("@price_Total", dgv_ctrl.Rows[i].Cells["Total_Price"].Value);
        cmd.CommandText = sql;
        cmd.ExecuteNonQuery();
    }
    

    Sql 字符串可以跳出循环。

    【讨论】:

    • cmd.Connection = SecurityMod.dbconn(); 在循环之外时,单独移动它不会有帮助。另外,会导致构建错误
    • 显然也移动所有相关行。
    • 发布解决方案时,请发布完整的解决方案。有时,我们不能指望他们自己做,除非我们在解决方案中提到。
    • 感谢您的回答。但是,我很好奇为什么即使 sql 查询在 for 循环之外它也能正常工作。不应该是错误还是什么?
    • slq 是一个字符串,所以它是不可变的。参数将在循环中更改而不是 sql 字符串。
    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2017-08-31
    相关资源
    最近更新 更多