2017-10-04 77 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()