我正在尝试从ASP.NET 2005运行此SQL但是因为它中有一个奇怪的字符”
而得到一个无效的SQL错误。
在我的代码中,我尝试将”
替换为"
,但它没有这样做,因为替换命令中的特殊字符正在更改为"
。
查询:
insert into userquery(description)
values ('In fact, Topeka Google Mayor Bill Bunten expressed it best: “Don’t be fooled. Even Google recognizes that all roads lead to Kansas, not just yellow brick ones.”')
如果我在mysql中复制并执行它,它可以正常工作。
我该如何解决这个问题?
答案 0 :(得分:7)
您构建的查询错误。您没有在客户端上说c#或vb.net,但无论哪种方式,您的sql字符串应该看起来更像这样:
string query = "insert into userquery(description) values (@description)";
然后您将描述值设置为:
using (var cn = new MySqlConnection("... your connection string here..."))
using (var cmd = new MySqlCommand(query, cn))
{
/* THIS IS THE IMPORTANT PART */
cmd.Parameters.Add("@description", SqlDbType.VarChar).Value = MyDescriptionVariable;
/*****************************/
cn.Open();
cmd.ExecuteNonQuery();
}
和vb版本:
Using cn As New MySqlConnection("... your connection string here..."), _
cmd As New MySqlCommand(query, cn)
''# THIS IS THE IMPORTANT PART
cmd.Parameters.Add("@description", SqlDbType.VarChar).Value = MyDescriptionVariable
''############################
cn.Open()
cmd.ExecuteNonQuery()
End Using
这将确保您的参数被正确转义,无论您有多么奇怪的字符。
答案 1 :(得分:4)
您应该在文本之前使用N来编写这样的查询:
insert into userquery(description) values (N'In fact, Topeka Google Mayor Bill Bunten expressed it best: “Don’t be fooled. Even Google recognizes that all roads lead to Kansas, not just yellow brick ones.”')
并确保该字段为nvarchar o ntext(后者已被弃用,支持nvarchar(max)btw。)。
无论如何,您应该遵循Joel Coehoorn建议使用参数化查询以避免这类问题和许多其他问题(如SQL注入),因为作为参数拉入数据库的字符串在到达数据库之前已经过清理和转义。
答案 2 :(得分:0)
实际的错误消息会有所帮助。如果这是一个unicode问题你可以尝试:
插入N:
insert into userquery(description)
values (N'In fact, Topeka Google Mayor Bill Bunten expressed it best: “Don’t be fooled. Even Google recognizes that all roads lead to Kansas, not just yellow brick ones.”')
或者看:replace MSWord smart quotes in asp.net webform
mystring.Replace("\u201C","\"").Replace("\u201D","\"")
答案 3 :(得分:-1)
该双引号的ASCII值为147。
Good Ol'VB6立即窗口:
?asc("“")
147
您可以使用转义双引号对Chr(147)进行替换:Chr(34)& Char(34)代表“”。