C#SQL Server查询更新/删除

C#SQL Server查询更新/删除,c#,sql-server,C#,Sql Server,我正在使用C#和SQL Server创建联系人列表,但这些语句引发了一个异常 SqlCommand smd = new SqlCommand("UPDATE contacts SET Name = '" + newName + "', Number = '" + newNumber + "' WHERE Name = " +nameToUpdate + "", cn); SqlCommand smd = new S

我正在使用C#和SQL Server创建联系人列表,但这些语句引发了一个异常

SqlCommand smd = new SqlCommand("UPDATE contacts SET Name = '" + newName + "', Number = '" + newNumber + "' WHERE Name = " +nameToUpdate + "", cn);

SqlCommand smd = new SqlCommand("DELETE FROM contacts WHERE Name = " + nameToDelete + "", cn);
列名“nameToUpdate/nameToDelete”无效

考虑一下你的问题

"UPDATE myTable SET mycolumn =  '"+newvalue+"' WHERE mycolumn = "+ oldvalue;
这将成为发送到SQL Server的以下查询

UPDATE mytable SET mycolumn = 'John' WHERE mycolumn = bob;
你看到错误了吗?
bob
周围缺少引号。此外,考虑你的新名字有点像“代码>约翰奥布莱恩< /代码>你认为你的查询会发生什么?

UPDATE mytable SET mycolumn = 'John O'Brian' WHERE mycolumn = bob;
显然,这是无效的语法

因此,您不应该创建这样的查询,而应该使用参数化查询。这将使您的应用程序更加健壮(即不会抛出上述错误)和安全(即防止SQL注入)。而且它的编写、阅读和维护更容易,因为你不必再关心引用之类的东西了

 var cmd = new SqlCommand("update table mytable set mycolumn = @newvalue where mycolumn = @oldvalue", connection);
 cmd.AddParam("@newvalue", SqlDbType.NVarChar).Value = "john";
 cmd.AddParam("@oldvalue", SqlDbType.NVarChar).Value = "bob";
 cmd.ExecuteNonQuery();

请不要这样做字符串concat来向sql语句中添加值。SQL注入错误将永远困扰您。@rene您能给出一个语句吗,I',对此很陌生您在
where name='“+nameToDelete+”中缺少引号“
。。。请不要这样修理它。查找如何使用SqlParameters。@虽然您提到的问题中被接受的答案是重复的,但原则上也回答了这个问题,但它确实使用了AddWithValue,这已经被考虑了很长一段时间了now@derpirscher如果你有一个给我的话,我很乐意再加一个更好的傻瓜。我试着找到一个这样的问题,从同一个问题开始,OP,然后把它解决成一个比我之前的评论更好的方向。我知道这种不好的做法。搜索查询的语句是什么?如果我想从名称中搜索一行是的,同样的原则…我发现缺少的唯一一点是,参数化查询使重复查询执行得更快,因为它们重用数据库的执行计划(除非计划生成得很差)。这是一个双赢:错误更少,可读性更强,执行速度更快