在DataGridView C#中更新多行

时间:2015-12-22 14:45:55

标签: c# sql sql-server datagridview

private void button1_Click(object sender, EventArgs e)
{
    cn.Open();
    SqlCommand cmd = new SqlCommand("UPDATE MEDICINE_REGISTRATION SET stock = @RStock WHERE id= " + Order_Datagridview.SelectedRows[0].Cells["id"].Value.ToString() + "", cn);

    foreach (DataGridViewRow row in Order_Datagridview.Rows)
    {

        // cmd.Parameters.AddWithValue("@RStock", row.Cells["RStock"].Value);

        cmd.Parameters.Add("@RStock", SqlDbType.VarChar).Value = Order_Datagridview.SelectedRows[0].Cells["RStock"].Value.ToString();
        cmd.ExecuteNonQuery();
        MessageBox.Show("Success");
        cmd.Parameters.Clear();

    }
    cn.Close();
}

3 个答案:

答案 0 :(得分:2)

WHERE条件的初始化在循环之外,并始终采用第一行的ID,而不是后续行的id。 应该为从网格中获取的每个值添加参数,id也应该参数化

最后,参数可以只添加一次,然后您可以简单地更新它们的值

private void button1_Click(object sender, EventArgs e)
{
    cn.Open();
    SqlCommand cmd = new SqlCommand(@"UPDATE MEDICINE_REGISTRATION 
                                     SET stock = @RStock 
                                     WHERE id= @id", cn);

    cmd.Parameters.Add("@RStock", SqlDbType.VarChar).Value = "";
    cmd.Parameters.Add("@id", SqlDbType.Integer).Value = 0;  

    foreach (DataGridViewRow row in Order_Datagridview.Rows)
    {
        // Use the row indexer here, not the fixed row at index zero
        cmd.Parameters["@RStock"].Value = row.Cells["RStock"].Value.ToString();
        cmd.Parameters["@id"].Value = Convert.ToInt32(row.Cells["id"].Value);
        cmd.ExecuteNonQuery();
    }
    cn.Close();}
}

关于连接和命令等一次性对象的使用也有一些说法。应在需要时创建这些对象,并在使用后立即处理。检查此模式的using statement

答案 1 :(得分:0)

也许

foreach (DataGridViewRow row in Order_Datagridview.SelectedRows)
{
    ..... DataGridViewRow.Cells["RStock"].Value.ToString();
}

答案 2 :(得分:0)

foreach 中,您没有使用DataGridViewRow,您还在使用DataGridView.Selected [0]。如果你想这样做,我会做一些改变:

  1. 保存来自ExecuteNonQuery()的返回值和MessageBox.Show那个值
  2. 在cmd.Parameters中,请确保添加当前行。
  3. 我可能会为每一行创建一个单独的命令。
  4. 这样的事情可能是:

    private void button1_Click(object sender, EventArgs e)
    {
        cn.Open();
    
        foreach (DataGridViewRow row in Order_Datagridview.Rows)
        {
            SqlCommand cmd = new SqlCommand("UPDATE MEDICINE_REGISTRATION SET stock = " + row.cless["RStock"].Value + "  WHERE id= " + row.Cells["id"].Value.ToString() + " ", cn);
    
            MessageBox.Show(cmd.ExecuteNonQuery());
    
         }
    
        cn.Close();
    }
    

    如果这对您不起作用,请尝试抓取该表所依据的DataTable或DataView源,并执行与上述相同的操作。