如何使我的查询只更新我想要的数据?
这是当前的代码
string query = string.Format("update Customer set title='{0}',[Name]='{1}'",titleComboBox2.Text,nameTextBox2.Text,"where ID="+idTextBox+"");
显然查询的最后部分不起作用。为什么会这样?
答案 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的攻击。在线有数百篇关于它的文章,请务必阅读相关内容以及如何相应地更新代码(提示 - 参数化查询)