查询更新了我的所有数据,而不仅仅是我想要的数据

时间:2015-08-02 19:10:21

标签: c# database

如何使我的查询只更新我想要的数据?

这是当前的代码

string query = string.Format("update Customer set title='{0}',[Name]='{1}'",titleComboBox2.Text,nameTextBox2.Text,"where ID="+idTextBox+"");

显然查询的最后部分不起作用。为什么会这样?

2 个答案:

答案 0 :(得分:3)

因为你没有使用任何索引参数{2}作为你的第三个参数WHERE部分。

这就是为什么您的查询仅包含update Customer set title='{0}',[Name]='{1}'部分的原因,因为它没有任何过滤器,因此会更新所有行。

有趣的是,如果要调试代码,可以将视为query

但更重要的是

您应始终使用parameterized queries。这种字符串连接对SQL Injection攻击开放。

假设您使用ADO.NET;

using(var con = new SqlConnection(conString))
using(var cmd = con.CreateCommand())
{
   cmd.CommandText = @"update Customer set title = @title, [Name] = @name 
                       where ID = @id";
   cmd.Paramter.Add("@title", SqlDbType.NVarChar).Value = titleComboBox2.Text;
   cmd.Paramter.Add("@name", SqlDbType.NVarChar).Value = nameTextBox2.Text;
   cmd.Paramter.Add("@id", SqlDbType.Int).Value = int.Parse(idTextBox.Text);
   // I assumed your column types.
   con.Open();
   cmd.ExecuteNonQuery();
}

答案 1 :(得分:2)

目前您的查询不使用WHERE子句,因为string.Format会忽略它。您有3个占位符参数,并且仅使用{0}{1},因此WHERE部分永远不会添加到SQL查询中。将您的查询更改为包含WHERE子句,例如像这样:

string query = string.Format("update Customer set title='{0}',[Name]='{1}' {2}",titleComboBox2.Text,nameTextBox2.Text,"where ID="+idTextBox.Text+"");

但是,您的代码中存在一个非常严重的缺陷 - 它容易受到SQL injection attack的攻击。在线有数百篇关于它的文章,请务必阅读相关内容以及如何相应地更新代码(提示 - 参数化查询)