Remplacer ' par \'

Résolu
Signaler
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour à tous,

Voila je suis sur un projet actuellement qui me demande (en partie) d'ajouter un client et j'ai un petit problème avec ma variable Adresse qui de temps en temps reçoit des valeurs avec des " ' " (Exemple : Chemin de l'Etang). Et j'aimerais que tous les " ' " soit remplacer par des " \' " pour que Access le prenne sans aucun problème car la comme ma requête SQL est comme ceci :

req = "INSERT INTO CLIENT VALUES ( ";
req += nocli.ToString() + ",' " + NomCli + " ' , ' " + PrenomCli + " ' ,0 " + tel_Cli.ToString();
req += ",' " + adresse + " ' , ' " + villesal + " ' , " + Ref_Quartier.ToString() +

Et donc forcément le fait d'avoir un " ' " dans l'adresse casse tous mon bordel :s

Voila merci pour vos futurs réponse ;-)

Ben.

16 réponses

Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
Hello,

On ne l'a peut-être plus assez dit ces derniers temps, mais il faut utiliser les requêtes paramétrées !!!

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
Hello,

Oui, Sauf erreur, OleDbParameter s'utilise de la même manière.

Pour la connectionstring, c'est une chaîne de caractères qui indique à ta connection (OleDbConnection en l'occurence), comment se connecter à ta base de donnée.
Si tu veux plus de renseignements sur les connectionstring, je te conseille de jeter un coup d'oeil ici.

Et pour la dernière question, il n'y a hélas pas de fonction éditer sur le forum.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009

Bon et bien je suis repasser à la vieille méthode en faisant un
adresse = adresse.Replace(" ' ", " '' "); (deux simple quotes)
Avant de lancer la requête et ca fonctionne parfaitement.
C'est bien plus à ma portée que les requêtes paramètrer qui ne fonctionnaient pas :)

Merci beaucoup en tous cas de l'aide que vous m'avez apporté et je garde dans un coin de ma tête les requêtes paramètrer et je vais le travailler :)

Aller je valide le tout ;)
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009

Salut SharpMao,

Merci de ta réponse, j'ai été voir ton tuto et en faite je ne connaissais absolument pas ce genre de procédé (je ne suis encore qu'un étudiant ^^) donc je suis en train de le tester. Merci :)

Petite question par contre sur ton Tuto.

Tu utilises SqlParameter, est-ce que tu penses que OleDbParameter s'utilise de la même manière ? Car j'utilise ce MiddleWare là "normalement" donc c'étais juste à titre indicatif car n'étant pas borné dans l'utilisation de mes outils j'ai opter pour ce que tu proposes dans ton tuto mais j'aimerai savoir, si tu connais la réponse bien sur.
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009

Erf une autre question dans ton tuto, tu as écris ceci :

SqlConnection

conn = newSqlConnection(connectionstring);

La question est la suivante ==> ConnectionString c'est bien une variable contenant le chemin d'accès à la BDD que j'utilise non ?
Ps: Suis nouveau sur Code-Source, il n'y a aucune fonction éditer ou je l'ai zapper ? 
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009

C'est re moi,  je rencontre des problèmes dans la réalisation de ton tutorial, surtout des manques de compréhensions.

Pourquoi mettres des @ ?
OleDbParameter

ParamNum =
new
OleDbParameter(
"@Num_Client",
OleDbType.Integer);

Autre chose aussi :

OleDbCommand

reqcmd =
new
OleDbCommand(sql.ToString(), connec);

// Ajout des parametr à la commande
reqcmd.Parameters.Add(ParamNom);
reqcmd.Parameters.Add(ParamPrenom);

J'utilise bien une redéfinition de la classe OleDbCommand en donnant comme paramêtre, ma grosse requête d'Update et Connec qui correspond a ma variable de connection OleDbConnection ? Et a quoi me sert l'ajout des paramêtres dans le reqcmd ? Est-ce que c'est ca qui va remplir les {0}, {1}, ... , {x} ?

En tout cas, je ne suis toujours pas sortie de l'auberge :D
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
5
Les requetes paramétrées, tu vas voir c'est simple une fois que t'en as fait une, c'est toujours pareil ;o

Je pense que le "@" c'est une sorte de convention. Je sais que pour PostgrSQL on utilise aussi beaucoup ":"

OleDbCommand cmd = new OleDbCommand("INSERT INTO bidules VALUES(@truc)", connec);
OleDbParameter p = new OleDbParameter("@truc", OleDbType.Integer);
p.Value = 13; //c'est ca qui va remplir!
cmd.Parameters.Add(p);

cmd.ExecuteNonQuery();
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
5
J'ajoute que la force de ça, c'est qu'après pour reexecuter la meme commande juste en changeant le param, c'est très simple:

cmd.Parameters["truc"].Value = 12; cmd.ExecuteNonQuery();
cmd.Parameters["truc"].Value = 999; cmd.ExecuteNonQuery();

etc. etc. ;)

Oui c'est vrai que c'est assez balèze comme système.
Avant je faisais toute mes requêtes en brut et
t'es vite emmerdé...

Microsoft a mis là un belle outil à dispo.

Bon tu peux toujours de créer une pire classe avec des méthode
pour chaque requête mais bon ca te prend plus de temps
qu'autre choses.

Sinon je sais pas si c'est en rapport mais
pour remplacer des caractère tu fait : String.Replace(Je sais plus les paras)....

Le savoir ne vaut rien s'il n'est pas partagé
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009

Bonjour bonjour,

Bon donc je pense avoir saisie le principe de ces requêtes paramétrés car lorsque je débug pas à pas et bien les valeurs se mettent correctement etc... Cependant, en quoi ca règle mon problème de simple quote qui fait planter l'écriture de ma requert d'INSERT dans ma BDD Access? :P Car dans mes souvenirs pour que Access accepte les simples quôtes, il faut mettre un \ avant. De plus pour les numéros de téléphonnes c'est du pareil au même le premier 0 est supprimer automatiquement ^^ mais ca encore c'est moins génant.

Pour être sur que j'ai bien comprit (ou pour voir que je n'ai absolument rien compris) je vous met une partie de mon code de requête parametrer comme ca vous allez pouvoir me corriger plus facilement :)

String sql =
"INSERT INTO CLIENT VALUES (@Num_Client, @Nom_Client, @Prenom_Client, @Tel_Client, @Adresse_Client, @Ville_Client, @ref_Quartier)";

OleDbCommand reqcmd =
new
OleDbCommand(sql, connec);

OleDbParameter ParamNum =
new
OleDbParameter(
"@Num_Client",
OleDbType.Integer);
ParamNum.Value = nocli;
reqcmd.Parameters.Add(ParamNum);

Je crois que c'est sur la bonne voie :P

Le savoir ne vaut rien s'il n'est pas partagé
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
14 juin 2009

Tant mieux ^^ Mais ca ne marche toujours pas :D
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
Hello,

Pour répondre a quelques-une de tes questions :

Le @ vient de SQL server, ou les variable, et donc les paramètres sont déclarés avec le @ au début.

Il n'y a pas besoin de faire de remplacement, car c'est le moteur d'éxécution (OleDn, en l'occurence) qui s'en charge. Ca te permet aussi d'éviter les attaques de type sql injection.

Tu dis que ça ne fonctionne tonours pas, est-ce que tu as une exception, un message d'erreur ?

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)

Ha oui juste, j'avais oublié ces injection SQL. C'est vrai que ça contre ces attaques.

ça évite également pas mal de if, pour tester tes paramètres...

Le savoir ne vaut rien s'il n'est pas partagé
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
Hello,

Je suis content pour toi que ça marche, mais méfie toi.
L'utilisation de ce genre de pratique est à bannir au plus vite.

Si tu as un message d'erreur lors de l'utilisation des paramètres, on pourra peut-être t'aider à avoir une solution plus "propre".

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
98
Salut,

De mémoire avec OleDb les paramètres sont uniquement par position, donc il y a des chances que le palceholder soit '?'.
Bien que dans certains cas les paramètres peuvent être nommés, sans doute pour faciliter la lecture, il faut par la suite ajouter les valeurs à la collection dans l'ordre de la requête.

String sql = "INSERT INTO CLIENT VALUES (@Num_Client, @Nom_Client, @Prenom_Client, @Tel_Client, @Adresse_Client, @Ville_Client, @ref_Quartier)";
OleDbCommand reqcmd = newOleDbCommand(sql, connec);
OleDbParameter ParamNum = newOleDbParameter("@Num_Client", OleDbType.Integer);
ParamNum.Value = nocli;
reqcmd.Parameters.Add(ParamNum);

=> Je pense qu'il manque 6 ajouts de valeurs là, non ?

Si seule la syntaxe '?' est supportée, la requête donnerais :
String sql = "INSERT INTO CLIENT VALUES (?, ?, ?, ?, ?, ?, ?)";

PS : Access ne supporte pas le nommage des colonnes cibles dans la requête ? Syntaxe INSERT INTO CLIENT(col1, col2, col3, ...) VALUES (valCol1, valCol2, valCol3, ...).

PS2 : s'il est encore besoin d'argumenter en faveur des requêtes paramétrées, j'avais écrit un petit truc sur le sujet : L'injection SQL n'est PAS un problème QUE pour les développeurs web !

/*
coq
MVP Visual C#
CoqBlog
*/