Creation de requete dynamique : Synthaxe

Résolu
Perecastorr Messages postés 39 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 7 septembre 2010 - 8 janv. 2010 à 10:54
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 - 8 janv. 2010 à 17:55
Bonjour,

Pour un petit logiciel que je suis en train de réaliser (mais aussi pour tout mes logiciels se connectant a une bdd) je créer des requetes dynamique.
Bien que mon résultat final soit correct je trouve ma synthaxe TRES lourde un petit exemple pour une requete d'update :

String requete = "UPDATE " + currentData.ItemArray[1] + " SET (";
   for (int i = 0; i < resultat.Tables[0].Columns.Count; i++)
   {
      requete += resultat.Tables[0].Columns[i].ColumnName.ToString() +
      " = '" + resultat.Tables[0].Rows[0].ItemArray[i].ToString() + "',";
   }
   requete = requete.Substring(0, requete.Length - 1);
   requete +") WHERE id " + currentData.ItemArray[4];


Ce code écrit la requete correctement mais elle n'ai vraiment pas claire pour un éventuel lecteur. J'ai pensé utilisé les String.Format mais sachant que j'ai une boucle, j'avoue que j'ai du mal a faire mieux que mon code brouillon...
Avez vous des conseils ?

Merci d'avance

8 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
8 janv. 2010 à 11:15
Salut,

Utilise le stringbuilder et la méthode appendFormat

Genre

StringBuilder sb = new StringBuilder();

sb.AppendFormat( "UPDATE {0} SET (", currentData.ItemArray[1]);
   for (int i = 0; i < resultat.Tables[0].Columns.Count; i++)
   {
      String Colonne = resultat.Tables[0].Columns[i].ColumnName.ToString();
      String Valeur= resultat.Tables[0].Columns[i].ColumnName.ToString();
      sb.append("{0}='{1}',",Colonne, Valeur);
   }
   requete = sb.toString().Substring(0, requete.Length - 1);
   requete +") WHERE id " + currentData.ItemArray[4];


3
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
8 janv. 2010 à 11:15
Hello !

Il est déconseillé de concaténer des string avec "+" pour des raisons de performance.
Utilise Stringbuilder à la place :

ex :

string Toto = new StringBuilder("Chaine_1").Append("Chaine_2").ToString();
Toto = new StringBuilder(Toto).Append("Chaine_3").ToString();
A+  
3
Perecastorr Messages postés 39 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 7 septembre 2010 1
8 janv. 2010 à 14:02
Petite précision technique qui peut resservir a n'importe qui :

"Eviter au maximum la class string, si on a besoin de puissance.
En C# toute modification d'une String entraine la création d'une nouvelle instance et donc une allocation mémoire.
Une string N'EST JAMAIS MODIFIABLE et l'allocation mémoire est une opération très couteuse en temps. Il faut donc travailler un maximum avec StringBuilder.

Besoin de comprendre le string intern pool. Quand on créé une string, le clr regarde dans un pool interne si elle existe avant de la créer. (méthode statique Intern de la classe string).

Donc string jamais collectés comme les objets communs dans le GC."
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
8 janv. 2010 à 17:55
De plus pour accelerer les performances et surtout la securité tu devrais utiliser des requetes paramétrées.

Car le plan d'execution sera sauvegardé et ca empeche les injections SQL.

Bon dev
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 janv. 2010 à 11:10
Salut,

C'est ça que tu veux faire : http://www.csharpfr.com/codes/MAFBINDERHELPER-CLASSE-BINDER-AUTOMATIQUEMENT-VOS-CLASSES-SUR-VOS_46970.aspx ?


Sébastien FERRAND
Lead Developpeur
Microsoft Visual C# MVP 2005 - 2009
0
Perecastorr Messages postés 39 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 7 septembre 2010 1
8 janv. 2010 à 11:27
@sebmafate : non c'est pas vraiment cela, ici je veux juste améliorer la lisibilité
@nhervagault : oui c'est exactement cela, merci!
@Moomoon07 : Merci pour la précision sur la performance !


Merci beaucoup, ceci va grandement améliorer la lisibilité et les performances!
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 janv. 2010 à 11:37
Dans le code que je t'ai envoyé, il y a toute la génération automatique de requêtes SELECT, DELETE, INSERT et UPDATE.

C'est tout ;)


Sébastien FERRAND
Lead Developpeur
Microsoft Visual C# MVP 2005 - 2009
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 janv. 2010 à 14:20
Perecastorr : c'est le cas avec tous les langages objets (Java, C#, VB.net, PHP...)

Une string est un pointeur vers un espace mémoire... toute modification entraine la création d'un nouveau et la suppression de l'ancien.

En effet le StringBuilder est mieux pour la concaténation de chaine dans une boucle... mais pour une allocation, la concaténation standard suffit amplement.

Mieux vaux :
string maString = "ma" + "string";

que :
StringBuilder sb = new StringBuilder();
sb.Append("ma");
sb.Append("string);
string maString = sb.ToString();




Sébastien FERRAND
Lead Developpeur
Microsoft Visual C# MVP 2005 - 2009
0
Rejoignez-nous