当我更新一行时,网格视图中的所有行都会被更新

本文关键字:更新 视图 一行 网格 | 更新日期: 2023-09-27 18:25:07

我正在Gridview中使用RowUpdating事件。当我更新一行时,网格视图中的所有行都会被更新。我的代码是

Con.Open();
SqlCommand cmd = new SqlCommand("update dbo.PersionalDetails set Name='" + txtName.Text + "',Location='" + txtLocation.Text + "' where id=id", Con);
cmd.ExecuteNonQuery();
Con.Close();
Label lblresult = new Label();
lblresult.ForeColor = Color.Green;
lblresult.Text = txtName.Text + " Details Updated successfully";
GridView1.EditIndex = -1;
BindGrid();

请帮忙!!

当我更新一行时,网格视图中的所有行都会被更新

这是因为所有行的where id = id都是true。它类似于where 1 = 1,并且它等于where TRUE。这就是为什么您的所有行都更新了。

来自=(等于)(Transact-SQL)

expression = expression

退货类型

布尔

由于id是列名,因此它们是有效的表达式。

我强烈认为你想添加这个id作为参数,但你甚至没有在代码中提到任何参数,所以…

也可以使用using语句来处理您的SqlConnectionSqlCommand

using (SqlConnection con = new SqlConnection(ConString))
{
   using (SqlCommand cmd = con.CreateCommand())
   {
      cmd.CommandText = "update dbo.PersionalDetails set Name = @name, Location = @location where id = @id";
      cmd.Parameters.AddWithValue("@name", txtName.Text);
      cmd.Parameters.AddWithValue("@location", txtLocation.Text );
      cmd.Parameters.AddWithValue("@id", YourIdValue);
      con.Open();
      cmd.ExecuteNonQuery();
   }
}

但更重要的是

您应该始终使用参数化查询。这种字符串串联对SQL注入攻击是开放的。

由于我们不知道您的列类型,我在示例中使用了AddWithValue,但没有使用此方法。使用.Add()作为最佳实践。

阅读:我们可以停止使用AddWithValue()吗?

用以下内容更改where子句:

where id='"+id+"'

并传递id 的值

它完成了!!!

请查看where子句并更正它,它总是TRUE

阅读关于SQL注入的另一件事,并更改您的编码风格。(此代码将无法在互联网上生存!)