使用MySQL,我遇到了以下代码:
Imports MySql.Data.MySqlClient 'Last version 6.9.9.0 ADO.Net driver for MySQL
Dim commandSQL As MySqlCommand
connMySQL.Open()
commandSQL = connMySQL.CreateCommand
commandSQL.Connection = connMySQL
commandSQL.CommandText = "UPDATE t_tesordacq SET COD_FOR=@COD_FOR WHERE
YEAR_DOC = 2017 And NUM_DOC = 123" With
commandSQL.Parameters.AddWithValue("@COD_FOR",txtCodFor.Text)
End With
commandSQL.ExecuteNonQuery()
commandSQL.Parameters.Clear()
当我在txtCodFor字段中插入一个包含撇号(ex:I')的文本时,代码出错(*错误:您的SQL语法中有错误;请查看与您的MySQL服务器版本对应的手册在'\'test' WHERE YEAR_DOC = 2017 And NUM_DOC = 123,* ).
附近使用正确的语法
我也尝试用双撇号替换文本:txtCodFor.Text.Replace(“'”,“''”)但没有任何事情可做。此外,如果我插入一个反斜杠,它是重复的!
我已经看到,如果我从my.ini中的sql_mode中删除“NO_BACKSLASH_ESCAPES”选项,一切正常。不幸的是,我无法永久删除此选项以与VB6中的书面应用程序兼容(ODBC连接)
谢谢你的帮助
MySqlParameter
对象默认会以'
序列逃脱\'
。这与NO_BACKSLASH_ESCAPES
服务器选项不兼容,导致语法错误。据我所知,没有选项可以覆盖此行为(在客户端中)。
您将不得不避免使用参数化查询,而是按照the documentation中的规则构造字符串文字;具体来说,用单引号括起字符串,并通过加倍来转义每个嵌入的单引号。
commandSQL = connMySQL.CreateCommand
commandSQL.Connection = connMySQL
commandSQL.CommandText = "UPDATE t_tesordacq SET COD_FOR='" &
COD_FOR.Replace("'", "''") &
"' WHERE YEAR_DOC = 2017 And NUM_DOC = 123"
commandSQL.ExecuteNonQuery()
我认为以下应该有效 -
var codeFor = txtCodFor.Text.Replace(@"'", @"\'");
commandSQL.Parameters.AddWithValue("@COD_FOR", codeFor);
在传递之前逃离'中的值'。