如何使用 SQL 查询更新表中的多行?

nao*_*ouf 3 c# sql

我是 SQL 和 C# 新手。 截屏

如屏幕截图所示,我想通过仅插入 中的数量、描述和价格值来更新“订单详细信息”表中的 3 行(订单#3)DataGridView2。我使用 Order_Number 和 DateTime 的组合来使订单详细信息唯一且易于在表中查找。

我使用了以下代码,但它根据 DataGridView2 中的第 0 行更新了订单 #3 的 3 行:

private void Update_OrderDetails_Click(object sender, EventArgs e)  
    {
        SqlConnection cn = new SqlConnection("Data Source=PCNmm-TOSH;Initial Catalog=mydb;Integrated Security=True");
        cn.Open();

             SqlCommand cm = new SqlCommand("UPDATE Customer_Order_Details SET Qty = @Qty, Description = @Description, Price =  @Price WHERE Order_Number = @OrderNumber and DateTime = @DateTime ");


            cm.Parameters.Add("@OrderNumber", SqlDbType.Int);
            cm.Parameters["@OrderNumber"].Value = 3;

            cm.Parameters.Add("@DateTime", SqlDbType.DateTime);
            cm.Parameters["@DateTime"].Value = "2015 - 12 - 17 15:04:57.043";



            cm.Parameters.Add("@Qty", SqlDbType.Int);
            cm.Parameters["@Qty"].Value = dataGridView2.Rows[0].Cells[2].Value;

            cm.Parameters.Add("@Description", SqlDbType.Text);
            cm.Parameters["@Description"].Value = dataGridView2.Rows[0].Cells[3].Value;

            cm.Parameters.Add("@Price", SqlDbType.Money);
            cm.Parameters["@Price"].Value = dataGridView2.Rows[0].Cells[4].Value;


            cm.Connection = cn;
            cm.ExecuteNonQuery();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用for语句for (i = 0; i <= dataGridView2.RowCount; i++)dataGridView2.Rows[i].Cells[Cell_Number].Value在参数中使用,则会出现错误“参数化查询 '(@OrderNumber int,@DateTime datetime,@Qty int,@Description text,' 需要参数 '@Qty',但未提供该参数”

我想要的是:

Row 1在订单明细表中 =DataGridView2 Row 0

Row 2在订单明细表中 =DataGridView2 Row 1

Row 3在订单明细表中 =DataGridView2 Row 2

但问题是:我不知道如何在数据库的 OrderDetail 表中索引这 3 行。知道如何使用 DataGridView2 中的 3 行更新数据库“订单详细信息”表中的 3 行(订单 3)吗?谢谢

Cet*_*soz 5

private void Update_OrderDetails_Click(object sender, EventArgs e)
{
    string sql = @"insert Customer_Order_Details 
        (Order_Number, DateTime, Qty, Description, Price)
        values
        (@OrderNumber, @DateTime@Qty, @Qty, @Description, @Price)";

    using (SqlConnection cn = new SqlConnection("Data Source=.;Initial Catalog=mydb;Integrated Security=True"))
    using (SqlCommand cm = new SqlCommand(sql, cn))
    using (SqlCommand delete = new SqlCommand("delete from Customer_Order_Details where Order_Number = @OrderNumber"))
    {

        cm.Parameters.AddWithValue("@OrderNumber", 3);
        cm.Parameters.AddWithValue("@DateTime", new DateTime(2015, 12, 17, 15, 4, 57, 43));
        cm.Parameters.AddWithValue("@Qty", 0);
        cm.Parameters.AddWithValue("@Description", "");
        cm.Parameters.AddWithValue("@Price", 0M);

        delete.Parameters.AddWithValue("@OrderNumber", 3);

        cn.Open();
        delete.ExecuteNonQuery();

        foreach (DataGridViewRow row in dataGridView2.Rows)
        {
            cm.Parameters["@Qty"].Value = row.Cells[2].Value;
            cm.Parameters["@Description"].Value = row.Cells[3].Value;
            cm.Parameters["@Price"].Value = row.Cells[4].Value;
            cm.ExecuteNonQuery();
        }
        cn.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

PS:代码只是一个示例。使用 order_number, datetime 作为唯一值是一个糟糕的主意(它不是唯一的,那是另一回事。即使是,这也是一个糟糕的主意)。代码使用删除+插入,因为您实际上没有主键可以使用更新(同样,这是一个糟糕的表设计)。