[C#] Fonction addslashes

Fonction addslashes [C#] - C#/.NET managed - Programmation

Marsh Posté le 12-01-2007 à 17:10:53    

Bonsoir à tous :)
 
Etant donnée que mon programme execute des requêtes SQL, certaines données contiennent des caractères "spéciaux" du genre (" ou ')
 
Lorsque qu'un caractère spécial apparait, j'ai le droit à une erreur.
 
Jusque la tout va bien
Pour régler le problème, j'ai donc créer une fonction permettant de régler ce problème...
 
En voici son code :

Code :
  1. static string addslashes(string txt)
  2.  {
  3.   txt.Replace("'","\\'" );
  4.   txt.Replace("\"","\\\"" );
  5.   return(txt);
  6.  }


 
Le problème c'est que cette fonction n'a pas l'air de bien fonctionner et je ne vois pas d'ou peut provenir l'erreur.
Replace est une fonction adapté au problème ? Est-elle la source du problème ?
Existe-t'il une fonction plus simple ?
 
Merci d'avance
 
Edit :
J'ai trouvé que un string.Format pouvait régler le problème... Je me renseigne sur le sujet

Message cité 1 fois
Message édité par cvex le 12-01-2007 à 17:19:18

---------------
http://forum.hardware.fr/hardwaref [...] 1293-1.htm
Reply

Marsh Posté le 12-01-2007 à 17:10:53   

Reply

Marsh Posté le 12-01-2007 à 17:22:28    

Je crois que tu devrais plutôt regarder comment utiliser des SqlParameter ;)
 

Reply

Marsh Posté le 12-01-2007 à 17:30:28    

Bon ba le string.Format regle pas le problème...
Je regarde ce que peut faire le SqlParameter :)

Reply

Marsh Posté le 13-01-2007 à 09:52:10    

+1 pour les SQLParameter qui assure également une certaine sécurité :)

Reply

Marsh Posté le 15-01-2007 à 10:07:37    

Merci pour la découverte de cette classe :)
Seulement, lors de la requête d'insertion, lorsque je regarde la table où je réalise les insert, Eh bien il y a rien dedans mis à part le ":observation".
 
Comment je pourrais faire pour placer les différentes variables dans la requête ?
Est-ce le "PointeurLecture.GetString(6)" qui ne correspond pas ? Existe-t'il une autre fonction ou une fonction plus approriée ?
 
Petit apperçu de mon script C# :

Code :
  1. string sql = "INSERT INTO appelsclient (idAppel, CAB, dateAppel, HeureAppel, dureeAppel, interlocuteur, logPersAppel, objetAppel, `precision`, observations, SensAppel, Attitude, ticket, idAction) VALUES (\":id_appel\", \":code_abonne\", \":date_appel\", \":heure_appel\", \"\", \"\", \"\", \":objet_appel\", \"\", \":observation\", \":sens_appel\", \"\", \"\", \"\" )";
  2.      MySqlCommand Ecrire = new MySqlCommand(sql, ConnectionDB2);
  3.   
  4.      Ecrire.Parameters.Add(new MySqlParameter("id_appel", MySqlDbType.Int64, 20));
  5.      Ecrire.Parameters[0].Value = PointeurLecture.GetString(0);
  6.      Ecrire.Parameters.Add(new MySqlParameter("code_abonne", MySqlDbType.Int64, 6));
  7.      Ecrire.Parameters[1].Value = PointeurLecture.GetString(1);
  8.      Ecrire.Parameters.Add(new MySqlParameter("date_appel", MySqlDbType.Date));
  9.      Ecrire.Parameters[2].Value = PointeurLecture.GetString(2);
  10.      Ecrire.Parameters.Add(new MySqlParameter("heure_appel", MySqlDbType.Time));
  11.      Ecrire.Parameters[3].Value = PointeurLecture.GetString(3);
  12.      Ecrire.Parameters.Add(new MySqlParameter("objet_appel", MySqlDbType.Set));
  13.      Ecrire.Parameters[4].Value = PointeurLecture.GetString(8);
  14.      Ecrire.Parameters.Add(new MySqlParameter("observation", MySqlDbType.LongBlob));
  15.      Ecrire.Parameters[5].Value = PointeurLecture.GetString(6);
  16.      Ecrire.Parameters.Add(new MySqlParameter("sens_appel", MySqlDbType.Set));
  17.      Ecrire.Parameters[6].Value = PointeurLecture.GetString(7);
  18.   
  19.      Ecrire.Connection = ConnectionDB2;
  20.      try
  21.      {
  22.      Ecrire.ExecuteNonQuery();
  23.      }
  24.      catch (MySqlException e)
  25.      {
  26.       /*Console.WriteLine("\n\n\nRequete : " + sql);
  27.       Console.WriteLine("Erreur SQL : " + e + "\n\n" );*/
  28.       Console.WriteLine("Numéro de l\'enregistrement : "+nbligne);
  29.       Console.ReadLine();
  30.      }


 
Merci pour votre aide :)

Message cité 1 fois
Message édité par cvex le 16-01-2007 à 12:17:43
Reply

Marsh Posté le 16-01-2007 à 09:57:37    

Hum apparament il faut utiliser des variables de type ?champ1 pour que cela puisse marché mais je n'ai toujours pas trouvé la solution :(

Reply

Marsh Posté le 16-01-2007 à 10:35:16    

cvex a écrit :

Merci pour la découverte de cette fonction :)


 
en fait il s'agit d'une classe  :D  
 

cvex a écrit :

Hum apparament il faut utiliser des variables de type ?champ1 pour que cela puisse marché mais je n'ai toujours pas trouvé la solution :(


 
J'ai toujours utilisé Sql Server 2000 et des procédures stockées, et donc dans ce cas tu peux faire un  

Code :
  1. SqlCommandBuilder.DeriveParameters(maCommande);


pour récupérer tes paramètres et leur type et ensuite les affecter.
 
Bon, si je lis bien tu fais du MySql sans procédure stockée, tu utilises donc une dll tiers, n'est-elle pas documentée ?
 
Il me semble qu'en SQL Server tu ferais quelquechose du genre :
 

Code :
  1. string sql = "INSERT INTO appelsclient (idAppel, CAB) VALUES ('@id_appel', '@code_abonne')";
  2. [...]
  3. Ecrire.Parameters.Add(new MySqlParameter("@id_appel", MySqlDbType.Int64, 20));


 
à vérifier dans la MSDN.
 
Quel est ton message d'erreur / la dll MySql que tu utilises ?


Message édité par pikti le 16-01-2007 à 10:36:11
Reply

Marsh Posté le 16-01-2007 à 12:16:46    

Oui, je l'ai certainement pas précisé mais je travaille avec la DLL MySQL donc c'est un peu différent d'après ce que j'ai pu voir :s
 
J'ai continuer à chercher et je suis actuellement à ce résultat la :
 

Code :
  1. while(PointeurLecture.Read())
  2.     {
  3.      string sql = "INSERT INTO appelsclient (idAppel, CAB, dateAppel, HeureAppel, dureeAppel, interlocuteur, logPersAppel, objetAppel, `precision`, observations, SensAppel, Attitude, ticket, idAction) VALUES (?id_appel, ?code_abonne, ?date_appel, ?heure_appel, \"\", \"\", \"\", ?objet_appel, \"\", ?observation, ?sens_appel, \"\", \"\", \"\" )";
  4.      MySqlCommand Ecrire = new MySqlCommand(sql, ConnectionDB2);
  5.   
  6.      Ecrire.Parameters.Add("?id_appel", MySqlDbType.Int64, 20).Value = PointeurLecture.GetString(0);
  7.       Ecrire.Parameters.Add("?code_abonne", MySqlDbType.Int64, 6).Value = PointeurLecture.GetString(1);
  8.       Console.WriteLine(PointeurLecture.GetDateTime(2).Year+"-"+PointeurLecture.GetDateTime(2).Month+"-"+PointeurLecture.GetDateTime(2).Day);
  9.       Ecrire.Parameters.Add("?date_appel", MySqlDbType.Date).Value = PointeurLecture.GetDateTime(2).Year+"-"+PointeurLecture.GetDateTime(2).Month+"-"+PointeurLecture.GetDateTime(2).Day;         
  10.    Ecrire.Parameters.Add("?heure_appel", MySqlDbType.Timestamp).Value = PointeurLecture.GetTimeSpan(3);
  11.       Ecrire.Parameters.Add("?objet_appel", MySqlDbType.Set).Value = PointeurLecture.GetString(8);
  12.       Ecrire.Parameters.Add("?observation", MySqlDbType.LongBlob).Value = PointeurLecture.GetString(6);
  13.       Ecrire.Parameters.Add("?sens_appel", MySqlDbType.Set).Value = PointeurLecture.GetString(7);
  14.      Console.ReadLine();
  15.   
  16.      Ecrire.Connection = ConnectionDB2;
  17.      try
  18.      {
  19.      Ecrire.ExecuteNonQuery();
  20.      }
  21.      catch (MySqlException e)
  22.      {
  23.       Console.WriteLine("\n\n\nRequete : " + sql);
  24.       Console.WriteLine("Erreur SQL : " + e + "\n\n" );
  25.       Console.WriteLine("Numéro de l\'enregistrement : "+nbligne);
  26.       Console.ReadLine();
  27.      }
  28.     //Console.WriteLine(myReader.GetString(0) + " | " + myReader.GetString(1));
  29.     nbligne++;
  30.     //Console.Write("." );
  31.     if(nbligne%250 == 0)
  32.     {
  33.      Console.Write("|" );
  34.     }
  35.     }


 
La classe (merci de m'avoir corriger =) ) MySQL c'est la galère :s
 
Lorsque j'execute, j'obtiens l'erreur suivante :  
 
http://img100.imageshack.us/img100/7038/erreurjn8.th.jpg

Reply

Marsh Posté le 16-01-2007 à 13:27:35    

comment peut on bosser sur un sgbd qui n'implémente pas les procédures stockées... ca me dépasse ca... ca gère les Select qd meme rassure moi :D

Reply

Marsh Posté le 16-01-2007 à 13:42:21    

MySQL oblige :s
Si j'avais eu le choix, je croix bien que je me serais penché sur le SGBD SQL server...

Reply

Marsh Posté le 16-01-2007 à 13:42:21   

Reply

Marsh Posté le 16-01-2007 à 13:51:05    

vu ton message d'erreur tu as un problème sur un champ de type date, d'ailleurs qu'est-ce que c'est que cette horrible ligne :
 

Code :
  1. Ecrire.Parameters.Add("?date_appel", MySqlDbType.Date).Value = PointeurLecture.GetDateTime(2).Year+"-"+PointeurLecture.GetDateTime(2).Month+"-"+PointeurLecture.GetDateTime(2).Day;


 
?
 
C'est un type date, donc passe une date, non ?
As-tu tester de faire un insert tout simple, avec des types de données primitifs ?


Message édité par pikti le 16-01-2007 à 14:29:32
Reply

Marsh Posté le 16-01-2007 à 14:14:50    

Oui, c'est un type date. D'ailleur, j'ai esseyé le fameux :  
 

Code :
  1. Ecrire.Parameters.Add("?date_appel", MySqlDbType.Date).Value = PointeurLecture.GetDateTime(2).Date;


 
Pour ce qui est de l'insert primitifs je vais essayé tout de suite...
 
Edit : J'ai essayé l'insert primitif et la requête ce fait correctement dans la base de données donc c'est bien les SQLParameter qui marche pas trop :s


Message édité par cvex le 16-01-2007 à 14:23:04
Reply

Marsh Posté le 16-01-2007 à 14:32:31    

il n'y a pas de problème avec SQLParameter, d'ailleurs sur l'exemple que tu donnes ci-dessus tu n'utilises pas cette classe de plus dans ton cas il s'agit de MySqlParameter :)
 
je ne sais pas quoi te dire, à part regarder la doc sur MySqlParameter et MySqlDbType.Date  :)


Message édité par pikti le 16-01-2007 à 14:33:52
Reply

Marsh Posté le 16-01-2007 à 15:26:09    

cvex a écrit :

Bonsoir à tous :)
Etant donnée que mon programme execute des requêtes SQL, certaines données contiennent des caractères "spéciaux" du genre (" ou ')
Lorsque qu'un caractère spécial apparait, j'ai le droit à une erreur.
Jusque la tout va bien
Pour régler le problème, j'ai donc créer une fonction permettant de régler ce problème...
En voici son code :

Code :
  1. static string addslashes(string txt)
  2.  {
  3.   txt.Replace("'","\\'" );
  4.   txt.Replace("\"","\\\"" );
  5.   return(txt);
  6.  }


Le problème c'est que cette fonction n'a pas l'air de bien fonctionner et je ne vois pas d'ou peut provenir l'erreur.
Replace est une fonction adapté au problème ? Est-elle la source du problème ?
Existe-t'il une fonction plus simple ?
Merci d'avance
Edit :
J'ai trouvé que un string.Format pouvait régler le problème... Je me renseigne sur le sujet


 
Salut!
Je vais revenir sur ton problème de Replace, car tu risques de le rencontrer souvent. Tu fais une erreur d'utilisation de la fonction.
Voilà sa déclaration (cf. MSDN)

Code :
  1. public string Replace (char oldChar,char newChar)
  2. Parameters
  3. oldChar
  4. A Unicode character to be replaced.
  5. newChar
  6. A Unicode character to replace all occurrences of oldChar.
  7. Return Value
  8. A String equivalent to this instance but with all instances of oldChar replaced with newChar.


 
Return Value est LE point important : String.Replace ne s'applique pas à l'objet sur lequel tu l'appelle, mais renvoie un objet de type String avec les modifications que tu attends. Fais bien attention, beaucoup de méthodes prennent cette forme !
 
@+!


---------------
Mon FeedBack Ebay
Reply

Marsh Posté le 18-01-2007 à 19:05:45    

ah oui j'avais meme pas fait gaffe a son code, ca sert a rien son Replace, il récupère pas la valeur :D

Reply

Marsh Posté le 19-01-2007 à 10:23:28    

J'ai beau faire comme la documentation officiel de la classe, le résultat est toujours le même :s

Reply

Marsh Posté le 22-01-2007 à 17:03:49    

De mémoire, le format Date a prendant longtemps été un problème avec ODBC et OLE DB pour MySQL.
Perso (mais ça fait longtemps) je n'ai jamais vu une version qui les supportait correctement.
 
A mon avis, le connecteurs .NET a tout simplement le même problème. Utilises un TIMESTAMP à la place.

Reply

Marsh Posté le 22-01-2007 à 19:14:30    

ou sinon il peut utiliser un vrai sgbd comme SQL Server :D

Reply

Marsh Posté le 22-01-2007 à 19:16:41    

le kouba [:ddr555]
 
on ne frappe pas un homme déjà à terre :o


Message édité par MagicBuzz le 22-01-2007 à 19:17:14
Reply

Marsh Posté le 22-01-2007 à 20:20:47    

et pourquoi pas ? SQL Server Express est gratuit et tres bien :o Comment peut on raisonnablement lui préférer mySQL ? (sauf si on est hébergé chez free, mais bon, apres on en a pour son argent : pas grand chose)

Reply

Marsh Posté le 22-01-2007 à 20:33:17    

ha ben j'ai rien dit.
juste que je gars vient de tomber dénu en s'appercevant que MySQL est une bouse infâme, et toi tu viens lui dire qu'il existe mieux en gratuit aussi :ange:
 
c'est un coup bas moi je te dis :o

Reply

Marsh Posté le 22-01-2007 à 21:42:08    

Reply

Marsh Posté le 08-02-2007 à 15:39:54    

xD
 
C'est très gentil à vous, le problème c'est que j'ai des contraintes... et la contrainte ici c'est notre MySQL.
 
Merci de vos interventions surtout pour le SQL Server Express :D lol
 
++

Reply

Marsh Posté le 11-02-2007 à 09:34:56    

ah bah apres si tu te tires volontairement une balle dans le pied... Y'en a qui aiment les défis dans la vie :)


Message édité par Tamahome le 11-02-2007 à 09:35:07
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed