Remplacer ' par \' [Résolu]

Rhend 43 Messages postés lundi 20 octobre 2008Date d'inscription 14 juin 2009 Dernière intervention - 7 janv. 2009 à 14:00 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 10 janv. 2009 à 18:46
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.
Afficher la suite 

16 réponses

Répondre au sujet
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 7 janv. 2009 à 14:28
+3
Utile
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)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de SharpMao
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 7 janv. 2009 à 15:38
+3
Utile
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)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de SharpMao
Rhend 43 Messages postés lundi 20 octobre 2008Date d'inscription 14 juin 2009 Dernière intervention - 8 janv. 2009 à 15:09
+3
Utile
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 ;)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Rhend
Rhend 43 Messages postés lundi 20 octobre 2008Date d'inscription 14 juin 2009 Dernière intervention - 7 janv. 2009 à 15:18
0
Utile
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.
Commenter la réponse de Rhend
Rhend 43 Messages postés lundi 20 octobre 2008Date d'inscription 14 juin 2009 Dernière intervention - 7 janv. 2009 à 15:26
0
Utile
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 ? 
Commenter la réponse de Rhend
Rhend 43 Messages postés lundi 20 octobre 2008Date d'inscription 14 juin 2009 Dernière intervention - 7 janv. 2009 à 16:42
0
Utile
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
Commenter la réponse de Rhend
bubbathemaster 342 Messages postés dimanche 26 janvier 2003Date d'inscription 25 mars 2009 Dernière intervention - 8 janv. 2009 à 00:13
0
Utile
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();
Commenter la réponse de bubbathemaster
bubbathemaster 342 Messages postés dimanche 26 janvier 2003Date d'inscription 25 mars 2009 Dernière intervention - 8 janv. 2009 à 00:15
0
Utile
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. ;)
Commenter la réponse de bubbathemaster
dadamagouil 141 Messages postés samedi 21 août 2004Date d'inscription 8 juin 2010 Dernière intervention - 8 janv. 2009 à 10:20
0
Utile
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é
Commenter la réponse de dadamagouil
Rhend 43 Messages postés lundi 20 octobre 2008Date d'inscription 14 juin 2009 Dernière intervention - 8 janv. 2009 à 10:40
0
Utile
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);
Commenter la réponse de Rhend
dadamagouil 141 Messages postés samedi 21 août 2004Date d'inscription 8 juin 2010 Dernière intervention - 8 janv. 2009 à 11:09
0
Utile
Je crois que c'est sur la bonne voie :P

Le savoir ne vaut rien s'il n'est pas partagé
Commenter la réponse de dadamagouil
Rhend 43 Messages postés lundi 20 octobre 2008Date d'inscription 14 juin 2009 Dernière intervention - 8 janv. 2009 à 11:13
0
Utile
Tant mieux ^^ Mais ca ne marche toujours pas :D
Commenter la réponse de Rhend
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 8 janv. 2009 à 11:29
0
Utile
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)
Commenter la réponse de SharpMao
dadamagouil 141 Messages postés samedi 21 août 2004Date d'inscription 8 juin 2010 Dernière intervention - 8 janv. 2009 à 12:09
0
Utile
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é
Commenter la réponse de dadamagouil
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 8 janv. 2009 à 15:25
0
Utile
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)
Commenter la réponse de SharpMao
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 10 janv. 2009 à 18:46
0
Utile
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
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.