【问题标题】:Update multiple rows in DataGridView C# [closed]更新 DataGridView C# 中的多行 [关闭]
【发布时间】:2015-12-22 14:45:55
【问题描述】:
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();
}

【问题讨论】:

  • 如果你想问一个问题,问一个问题。不要只是转储一些代码并希望获得最好的结果
  • 代码只更新第一行。我想要的只是更新 datagridview 中的所有行。当我单击按钮时。我该怎么办?有什么问题?
  • 有很多。
  • 问题 1:由于 sql 命令中的字符串连接,您的代码容易受到 SQL 注入攻击。您已经使用了参数,因此请始终使用它们。
  • 代码只更新第一行因为你没有做任何任何事情来更新其余部分,因为你用Order_Datagridview.SelectedRows[0].Cells["id"].Value过滤你的命令在WHERE 子句上。考虑先改变你的逻辑。

标签: c# sql sql-server datagridview


【解决方案1】:

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 的这种模式

【讨论】:

  • 谢谢史蒂夫先生。它现在可以工作了:)
【解决方案2】:

也许

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

?

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 - From Review
  • 哎呀.. 以为我无法发表评论,这对我来说似乎是答案.. 很难在没有访问数据库的情况下进行测试 ;)
  • @noontz:几句话描述提问者的代码中的错误会让你回答得更好。这也将阻止其他人将答案视为评论。 [通常,答案中的代码应附有一些描述。]
  • @Tsyvarev thx.. 我会记住这一点 ;)
【解决方案3】:

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

  1. 保存来自 ExecuteNonQuery() 和 MessageBox 的返回值。显示该值
  2. 在 cmd.Parameters 中,确保添加当前行。
  3. 我可能会为每一行创建一个单独的命令。

可能是这样的:

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 源并执行与上述相同的操作。

【讨论】:

  • 谢谢先生。它现在可以工作了:)
  • 谢谢,害羞!如果您标记对您有用的答案,它会帮助我们这些提供帮助的人。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 2021-08-27
  • 2021-01-15
  • 2019-05-24
  • 2012-09-26
相关资源
最近更新 更多