J'apprécie vraiment votre aide mesdames et messieurs - et un merci spécial à Progman, votre commentaire a résolu mon problème.
Pour résumer, je vais maintenant répondre à ma propre question. Il y a 3 solutions possibles :
Le problème est lié au mode SQL NO_BACKSLASH_ESCAPES. Une solution pourrait consister à désactiver ce mode SQL particulier.
fubo l'a mentionné dans son commentaire :
Le résultat de l'échappement de MySql.Data.MySqlClient.MySqlHelper.EscapeString("12'34")
es 12\'34
C'est bizarre, mais le mode SQL NO_BACKSLASH_ESCAPES a du mal à gérer les chaînes d'échappement des valeurs de paramètres (à mon avis, il s'agit d'un bogue dans Connector/Net, puisque Connector/ODBC fonctionne bien). Une autre solution pourrait être d'utiliser Connector/ODBC.
La dernière astuce pour moi était le commentaire de Progmans :
Selon dev.mysql.com/doc/connector-net/fr/ vous devez appeler Prepare() avant d'ajouter les valeurs.
Il s'agit plutôt d'une solution de contournement, mais si vous utilisez le mode SQL NO_BACKSLASH_ESCAPES et les paramètres de commande ensemble, vous devez appeler Prepare()
avant d'appeler ExecuteNonQuery()
. Veuillez noter que - contrairement à l'exemple dans le guide du développeur - je ne pouvais pas l'appeler avant d'avoir ajouté les paramètres (vous obtiendriez une exception), et j'ai ajouté IgnorePrepare=false
à la chaîne de connexion. Je suppose que la raison pour laquelle cela fonctionne est que cela modifie le transfert de données entre le client et le serveur :
Un autre avantage des instructions préparées est que, lorsque les instructions préparées côté serveur sont activées, elles utilisent un protocole binaire qui rend le transfert de données entre le client et le serveur plus efficace.
Voici l'extrait de code qui fonctionne pour moi :
//add IgnorePrepare=false to the connection string
MySqlConnection Con = new MySqlConnection("Server = localhost; Port = 3306; Database = param_test; Uid = ***; Pwd = ***; SslMode=none; IgnorePrepare=false");
Con.Open();
MySqlCommand Cmd = new MySqlCommand("INSERT INTO testtab(TestCol1,TestCol2) VALUES(@test1,@test2)", Con);
Cmd.Parameters.AddWithValue("@test1", "12'34");
Cmd.Parameters.AddWithValue("@test2", "56");
Cmd.Prepare(); //calling it after Adding the parameters works fine
Cmd.ExecuteNonQuery();