2017-10-04 5 views
0

私は次のコードでは、MySQLで、問題を抱えている:私はアポストロフィ(例が含まれていtxtCodForフィールド内のテキストを挿入すると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() 

私は)、コードが間違っています(*エラー:SQL構文にエラーがあります。使用する正しい構文についてはMySQLサーバのバージョンに対応するマニュアルをチェックしてください。'\'test' WHERE YEAR_DOC = 2017 And NUM_DOC = 123,*).

また、ダブルアポストロフィを使用したテキスト:txtCodFor.Text.Replace( "'"、 "' '")しかし何もしませんでした。 また、バックスラッシュを挿入すると、複製されます!

my.iniのsql_modeから "NO_BACKSLASH_ESCAPES"オプションを削除すると、すべて正常に動作することがわかりました。 残念ながら、私は永久に(ODBC接続)VB6で書かれたアプリケーションとの互換性のために、私は次のように動作するはずだと思うあなたの助け

+0

なぜこれをC#でタグ付けしましたか? – DavidG

+0

私もコード例を受け入れるので# –

答えて

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 ( "'"、 "' '")、私はエラー.... aveの近くで使用する構文' \ 'j'、... –

1

オブジェクトは、デフォルトで\'というシーケンスで'をエスケープします。これは、構文エラーの原因となっている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()