c# - 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”无效
解决方案
考虑您的查询
"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();
推荐阅读
- python - python中带有两个布尔值的运算符
- typescript - Firebase Cloud Functions - 制作 Telegram Bot 时出现“TypeError:无法读取未定义的属性‘切片’”
- c++ - 如何使用 llvm::IRBuilder 创建 Add/Sub/Mul/Div?
- mysql - 在MySql的描述字段中搜索传递关键字的出现次数
- java - 使用 java 和 spring MVC 构建服务器
- javascript - CORS 策略已阻止访问 XMLHttpRequest (sound.mp3)
- ios - 在 iOS 中使用深度链接进行 UPI 集成
- javascript - 如何在没有 500 错误代码的情况下将 formdata 与 axios post 一起使用?
- advanced-custom-fields - 您可以在简码中添加 if/get/echo 语句吗
- javascript - 在关闭浏览器或选项卡上清除本地存储