2017-10-04 79 views
0

我有问题,使用MySQL,用下面的代码:MySQL的.NET连接器撇号问题

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 [email protected]_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连接)

感谢您的帮助的书面申请删除此选项兼容性

+0

你为什么用C#标记这个? – DavidG

+0

,因为我也接受c#代码示例# –

回答

0

我认为以下应工作 -

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

逃离'在通过它之前的价值中。

+0

对不起,但是不行... :( –

+0

@MarcoZecchi - 请问你可否试试修改后的代码? –

+0

我试过输入代码:abc'j 其结果是:您的SQL语法错误;检查对应于您的MySQL服务器版本的手册,以在'j'附近使用正确的语法,WHERE YEAR_DOC = 2017和NUM_DOC = 123 我试过用这个替换替换(“'”,“''”),我错误....语法使用附近'\'j',... –

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()