2014-10-01 59 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注入,並改變你的編碼風格。(此代碼將不會在互聯網上生存!)