尝试通过 ASP.NET 中的命令文本在 SQL Server 2014 中插入“Rahul's Sister”时出错 [重复]
Posted
技术标签:
【中文标题】尝试通过 ASP.NET 中的命令文本在 SQL Server 2014 中插入“Rahul\'s Sister”时出错 [重复]【英文标题】:Get Error when trying to insert ' Rahul's Sister ' in SQL Server 2014 through command text in ASP.NET [duplicate]尝试通过 ASP.NET 中的命令文本在 SQL Server 2014 中插入“Rahul's Sister”时出错 [重复] 【发布时间】:2018-06-09 07:35:54 【问题描述】:我正在尝试将给定字符串插入到我的表 table1
中,但出现错误
s 附近的语法不正确
如果我将“rahul 的妹妹”之类的字符串作为输入传递,它运行良好,但在尝试传递“Rahul 的妹妹”时会抛出错误。
请告诉我该怎么办?
String str = "Rahul's Sister"
cmd.Connection = con;
con.Open();
cmd.CommandText = "insert into table1(relation_n) values(N'"+str+"')";
con.Close();
【问题讨论】:
您是否尝试过将其作为参数传递,例如cmd.Parameters.AddWithValue("@str", str);
查看参数化您的代码。不要像您所做的那样连接文字字符串。想象一下,如果有人通过名称'); USE master; CREATE LOGIN NewSA WITH PASSWORD = '123', CHECK_POLICY = FALSE; ALTER SERVER ROLE sysadmin ADD MEMBER NewSA;--
。这可能是您在服务器上可以利用的一个不错的新系统管理员 :)
Give me parameterized SQL, or give me death
【参考方案1】:
下面是一个参数化查询示例,它将解决您的报价问题。指定您的实际数据库列数据类型和最大长度。
cmd.CommandText = "insert into table1(relation_n) values(@relation_n)";
cmd.Parameters.Add("@relation_n", SqlDbType.VarChar, 50).Value = str;
参数化查询:
更安全,防止 SQL 注入 无需在字符串中转义引号 避免需要以特定方式格式化日期字符串文字,这种方式因文化而异 不需要小数分隔符 通过促进计划缓存重用来提高性能 更简洁、更易于维护的代码我建议避免使用 AddWithValue,因为该方法从 .NET 类型推断 SQL 数据类型。当数据类型不匹配时,这可能会导致不希望的结果,例如全表扫描。此外,由于字符串类型的长度是由实际字符串长度决定的,因此您最终会得到比 SQL Server 所需更多的缓存计划,从而浪费内存并增加编译成本。
【讨论】:
【参考方案2】:使用双撇号
String str = "Rahul''s Sister";
而不是
String str = "Rahul's Sister";
顺便说一句,你需要使用参数来避免SQL注入。
【讨论】:
但是当我从文本框中得到输入并且其中很多单词包含'??每次我使用''标志?? 如果您从文本框中获得输入,我认真建议您将其作为参数传递,因为 sql 注入。 @AmitSingh 一种简单的方法,您可以在插入数据之前通过Replace
函数执行此操作。 rextester.com/SUAL52540,I 会建议你使用 sqlparameter
,就像 Hasan Gholamali 说的那样【参考方案3】:
尝试从Rahul's
中删除'。或者试试"Rahul''s sister"
【讨论】:
以上是关于尝试通过 ASP.NET 中的命令文本在 SQL Server 2014 中插入“Rahul's Sister”时出错 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 C# ASP.net 从 SQL Server 中的文本框中存储日期