2014-10-01 31 views
1

我在Gridview中使用RowUpdating事件。当我更新一行时,gridview中的所有行都会更新。我的代码是当我更新一行时,gridview中的所有行都得到更新

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(); 

请帮忙!!

+1

Id始终等于id ..首先删除sql注入'''; DROP TABLE xxx; - '....并将您的位置'id = id'更改为参数 – Nico 2014-10-01 07:20:47

回答

4

这是因为where id = idtrue所有行。它就像where 1 = 1,它等于where TRUE。这就是你更新所有行的原因。

= (Equals) (Transact-SQL)

expression = expression 

返回类型

布尔

由于id的是列名,它们是有效的expressions

像你想添加这个id作为参数,但你甚至没有提到在你的代码的任何参数我强烈地感觉到,所以..

还可以使用using statement处置您的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(); 
    } 
} 

但更重要的

你应该总是使用parameterized queries。这种字符串连接对于SQL Injection攻击是开放的。

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

阅读:Can we stop using AddWithValue() already?

+0

,但是如果他想更新特定的行,那么他必须将id的值传递给它...不是吗? – 2014-10-01 07:25:40

+0

@rushankshah是的。当他将'id'作为值传递时,它只匹配'id'列中具有此值的行。 – 2014-10-01 07:29:18

+0

嗯......是啊.. – 2014-10-01 07:30:50

0

改变你的where子句中使用下列内容:

where id='"+id+"' 

并传递价值ID

它完成!

0

请看看你的where子句并纠正它,它始终是TRUE

一件事情要做了解SQL注入,并改变你的编码风格。(此代码将不会在互联网上生存!)