【问题标题】:C# SQL Server query UPDATE/DELETE [duplicate]C# SQL Server 查询更新/删除 [重复]
【发布时间】:2021-03-08 08:09:47
【问题描述】:

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

【问题讨论】:

  • 请不要做这样的字符串连接来将值添加到 sql 语句中。 SQL 注入错误将永远困扰您。
  • @rene 你能发表一下声明吗,我对此很陌生
  • 您在where name = '" + nameToDelete + "'" 中缺少引号......请不要这样修复它。查找如何使用 SqlParameters。
  • @rene 虽然在您提到的问题中接受的答案是重复的,但原则上也回答了这个问题,但它确实使用了 AddWithValue,它在很长一段时间内被认为是bad practice
  • @derpirscher 如果你有一个更好的骗子,我很高兴为我添加一个更好的骗子。我试图找到一种以与 OP 相同的问题开始的方法,然后将其解决为比我之前的评论更好的方向。我知道这种不好的做法。

标签: c# sql-server


【解决方案1】:

考虑您的查询

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

【讨论】:

  • 搜索查询的语句是什么?如果我想从其名称中搜索一行
  • 是的,原理一样……
  • 我发现唯一缺少的是参数化查询使重复查询执行得更快,因为它们重用了数据库的执行计划(除非计划生成不佳)这是双赢的:更少的错误,更具可读性,执行速度更快
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 2020-02-17
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多