首页 > 解决方案 > C# SQL Server 查询更新/删除

问题描述

我正在使用 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”无效

标签: c#sql-server

解决方案


考虑您的查询

"UPDATE myTable SET mycolumn =  '"+newvalue+"' WHERE mycolumn = "+ oldvalue;

这成为发送到 SQL Server 的以下查询

UPDATE mytable SET mycolumn = 'John' WHERE mycolumn = bob;

你看到错误了吗?周围缺少引号bob。此外,考虑您的新名称类似于John O'Brian您的想法,您的查询会发生什么?

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();

推荐阅读