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();
}
答案 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]。如果你想这样做,我会做一些改变:
这样的事情可能是:
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源,并执行与上述相同的操作。