mysql .net连接器Apostrophe问题

时间:2017-10-04 08:43:38

标签: mysql .net vb.net

我遇到问题,使用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 字段中插入文本时,其中包含撇号(例如:我),代码出错(*错误:你有一个SQL语法错误;请查看与MySQL服务器版本对应的手册,以便在'\'test' WHERE YEAR_DOC = 2017 And NUM_DOC = 123,* ).附近使用正确的语法

我也尝试用双撇号替换文本: txtCodFor.Text.Replace(“'”,“''”)但是没有任何关系。 另外,如果我插入一个反斜杠,它就会重复!

我已经看到,如果我从my.ini中的sql_mode中删除“ NO_BACKSLASH_ESCAPES ”选项,一切正常。 不幸的是,为了与VB6(ODBC连接)中的书面应用程序兼容,我不能永久删除此选项

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

默认情况下,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()

答案 1 :(得分:0)

我认为以下内容应该有效 -

var codeFor = txtCodFor.Text.Replace(@"'", @"\'");
commandSQL.Parameters.AddWithValue("@COD_FOR", codeFor);

逃离'在传递它之前的值。