Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查询更新我的所有数据,而不是只更新我想要的数据_C#_Database - Fatal编程技术网

C# 查询更新我的所有数据,而不是只更新我想要的数据

C# 查询更新我的所有数据,而不是只更新我想要的数据,c#,database,C#,Database,如何使查询只更新所需的数据 这是当前的代码 string query = string.Format("update Customer set title='{0}',[Name]='{1}'",titleComboBox2.Text,nameTextBox2.Text,"where ID="+idTextBox+""); 显然,查询的最后一部分不起作用。为什么会这样?当前您的查询没有使用WHERE子句,因为它被string.Format忽略。您有3个占位符参数,并且只使用了{0}和{1},因

如何使查询只更新所需的数据

这是当前的代码

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

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

当前您的查询没有使用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+"");

然而,您的代码中有一个非常严重的缺陷——它容易受到攻击。网上有数百篇关于它的文章,请务必阅读关于它是什么以及如何相应地更新代码提示-参数化查询目前您的查询不使用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+"");

然而,您的代码中有一个非常严重的缺陷——它容易受到攻击。网上有数百篇关于它的文章,请务必阅读关于它是什么以及如何相应地更新代码的提示-参数化查询

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

这就是为什么您的查询将只包含更新客户集标题={0},[Name]={1}部分。这将更新您的所有行,因为它没有任何筛选器

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

但更重要的是 你应该经常使用。这种类型的字符串连接对攻击是开放的

假设您使用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();
}

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

这就是为什么您的查询将只包含更新客户集标题={0},[Name]={1}部分。这将更新您的所有行,因为它没有任何筛选器

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

但更重要的是 你应该经常使用。这种类型的字符串连接对攻击是开放的

假设您使用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();
}

谢谢你的回复!尝试使用该代码时,会弹出一个语法错误。为什么会这样?@huehuehue很可能是因为idTextBox是一个文本框,所以您需要使用idTextBox.Text。我根据答案更新了答案它有效!非常感谢你。至于这个漏洞,如果我只是为学校项目编写代码,我可以忽略它吗?@huehuehue SQL注入攻击可能是灾难性的。你越早开始以正确的方式使用代码就越好。这是你不能忽视的。老师,如果你忽略了你的项目,阅读你的项目应该给你零分。谢谢你的回复!尝试使用该代码时,会弹出一个语法错误。为什么会这样?@huehuehue很可能是因为idTextBox是一个文本框,所以您需要使用idTextBox.Text。我根据答案更新了答案它有效!非常感谢你。至于这个漏洞,如果我只是为学校项目编写代码,我可以忽略它吗?@huehuehue SQL注入攻击可能是灾难性的。你越早开始以正确的方式使用代码就越好。这是你不能忽视的。老师,如果你忽略了你的项目,阅读你的项目应该给你零分。你正在处理的数据是什么,正在发生什么,你期望发生什么您不应该将SQL语句连接在一起-使用参数化查询来避免SQL注入您正在处理的数据是什么,正在发生什么,以及您希望发生什么您不应该将SQL语句连接在一起-使用参数化查询来避免SQL注入如何检查是否使用ADO.NET?我想我使用的是OleDb。我该怎么办?@huehuehue然后在我的示例中使用OleDbConnection和OleDbCommand,而不是SqlConnection和SqlCommand。如何检查我是否使用ADO.NET?我想我使用的是OleDb。我该怎么办?@huehuehue然后在我的示例中使用OleDbConnection和OleDbCommand,而不是SqlConnection和SqlCommand。