4 votes

Paramètres de commande MySql avec guillemets

Je veux insérer des lignes dans une base de données MySql à travers mon application c# (en utilisant Connector/Net 8.0.11). J'utilise des paramètres de commande pour passer les valeurs parce que - d'après ce que j'ai compris - je n'ai pas à me soucier des caractères spéciaux. Veuillez trouver un exemple de code simplifié ci-dessous.

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.ExecuteNonQuery();

Mais le guillemet simple dans "12'34" conduit à une exception :

"Vous avez une erreur dans votre syntaxe SQL. correspondant à la version de votre serveur MySQL pour connaître la syntaxe à utiliser. près de '34', '56')' à la ligne 1".

Je sais que je pourrais simplement ne pas utiliser de paramètres du tout, et simplement doubler le guillemet à l'intérieur de ma chaîne de valeur... mais j'ai construit des applications similaires en utilisant Connector/ODBC et elles fonctionnent bien. Pouvez-vous m'aider à trouver l'astuce avec Connector/Net ?

0voto

m.denis Points 41

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X