IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Convertir chaine sql en stringbuilder


Sujet :

C#

  1. #21
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par olibara Voir le message
    pour BlueDeep


    A bon ?

    Je t'informe que chaque Append est une concaténation en vue de produire la chaine SQL résultante
    Je t'informe que tu ferais bien dans ce cas de choisir des exemples un peu plus démonstratifs, puisque celui que tu as posté revenait à découper une chaine constante en une succession d'éléments constants. Donc ton exemple démontrait surtout l'inutilité d'un Sb dans ce cas.

    car entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string myString = "AA_BB";
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    StringBuilder mySb = new StringBuilder()
    mySb.Append("AA");
    mySb.Append("_");
    mySb.Append("BB");
    string myString = mySb.ToString();
    Le choix est vite fait !!!!


    Comme je l'ai dis l'intéret du stringbuilder et de pouvoir faicilemnt introduire le cas échéant un AppendFormat on manipuler des eléments
    Je ne t'ai surtout pas attendu pour me servir des sb, rassure toi.

    Dans le cas des requêtes Sql, l'utilité du Sb n'existe que quand on doit rajouter des éléments conditionnels (style "dans un cas j'ai besoin de rajouter un WHERE, dans un autre non"), puisque sur les éléments variants mais non structurants de la requêtes, l'utilisation su Sb en lieu et place des paramètres serait une faute.

  2. #22
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Ca me semble étrange comme façon de procéder. Comme Guulh, je trouve qu'une string Verbatim est bien plus simple à utiliser tout en étant plus clair (pas de sb.Append de partout).

    Si on reprend ton exemple on obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    string query = 
    @"SELECT
    COUNT(*) AS cnt,
    PhysicalBag.ID,
    PhysicalBag.Number,
    PhysicalBag.FillingLevel AS FLev,
    PhysicalBag.OpenDate,
    PhysicalBag.CloseRequestDate AS CloseNeedDt,
    PhysicalBag.CloseRequiredDate AS CloseAskedDt,
    PhysicalBag.CloseDate AS CloseDt,
    PhysicalBag.ParcelCollectDefer AS ColectDay,
    PhysicalBag.ReceivedDate AS ReceivedDt,
    PhysicalBag.DispatchedDate,
    Affiliate.HRK,
    Affiliate.Name,
    Affiliate.PhoneNumber,
    Affiliate.FaxNumber,
    Affiliate.GSMNumber,
    Affiliate.Email
    FROM
    PhysicalBag
     INNER JOIN Affiliate ON PhysicalBag.AffiliateID = Affiliate.ID
     INNER JOIN VirtualBag ON PhysicalBag.ID = VirtualBag.PhysicalBagID
     INNER JOIN TradeIn ON VirtualBag.ID = TradeIn.VirtualBagID
    WHERE (PhysicalBag.OpenDate < CONVERT(DATETIME, '2010-07-30 00:00:00', 102))
      AND (PhysicalBag.CloseDate IS NULL)
      AND (PhysicalBag.CloseRequestDate IS NULL)
    GROUP BY PhysicalBag.ID,
    PhysicalBag.Number,
    PhysicalBag.FillingLevel,
    PhysicalBag.OpenDate,
    PhysicalBag.CloseRequestDate,
    PhysicalBag.CloseRequiredDate,
    PhysicalBag.CloseDate,
    PhysicalBag.ParcelCollectDefer,
    PhysicalBag.ReceivedDate,
    PhysicalBag.DispatchedDate,
    Affiliate.HRK, Affiliate.Name,
    Affiliate.PhoneNumber,
    Affiliate.FaxNumber,
    Affiliate.GSMNumber,
    Affiliate.Email
    HAVING (COUNT(*)>5)";
    C'est quand même plus simple et plus clair non ? Et s'il y a des paramètres, les requêtes paramétrées sont là pour ça, il suffit de placer les @param qui vont bien dans la chaîne.

    Sinon utiliser un StringBuilder en l'état n'apporte absolument rien, sauf erreur de ma part, car lorsque tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "maChaine1" + "maChaine2" + "maChaine3" + ... + "maChaineXXX"
    le compilateur est assez malin pour voir que tu concatènes des chaînes de caractères constantes et d'optimiser le code pour n'avoir plus qu'une seule chaîne, et donc pas de concaténation.

  3. #23
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    le compilateur est assez malin pour voir que tu concatènes des chaînes de caractères constantes et d'optimiser le code pour n'avoir plus qu'une seule chaîne, et donc pas de concaténation.
    Tout à fait; en revanche dans le cas de chaines variantes, la différence de perf est assez importantes (j'ai posté le semaine dernière un bout de code qui illustrait la question), surtout quand on "autoconcatène" la chaine, ça devient du 1 pour 1000.

  4. #24
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par Pol63
    donc nous partout dans notre code c'est

    dim rq as string = "" & VbCrlf & _
    "SELECT ch ... " & VbCrLf & _
    " FROM table" & VbCrLf & _
    " WHERE"

    donc pas super
    Tu comprends l'intéret du stringBuilder maintenant ?

    Je ne suis pas expert en vb mais ca donnerait +/- ceci (c'est quand meme plus lisible)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim sb as new StringBuilder()
     
    sb.Append(" SELECT ch ... ")
    sb.Append(" FROM table")
    sb.Append(" WHERE")
    Et tu prends soin de preceder chaque chaine avec un blanc

  5. #25
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par olibara Voir le message
    donc nous partout dans notre code c'est

    dim rq as string = "" & VbCrlf & _
    "SELECT ch ... " & VbCrLf & _
    " FROM table" & VbCrLf & _
    " WHERE"

    donc pas super

    Tu comprends l'intéret du stringBuilder maintenant ?
    Absolument pas.

    Dans cas j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sql = @"select a, b from tab t
               join tab2 t2
               on t2.Id = t.id
               where t.Lib = @tlib"
    encore une fois, je ne vois aucun interêt à utiliser un assemblage de chaine constante quand il n'y en a besoin que d'une.
    Et ici on est sur le forum C# donc ton exemple est non relevant (peut être qu'en VB le caractère chaine littérale n'existe pas ? je n'en sais rien).

  6. #26
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par olibara Voir le message
    donc nous partout dans notre code c'est

    dim rq as string = "" & VbCrlf & _
    "SELECT ch ... " & VbCrLf & _
    " FROM table" & VbCrLf & _
    " WHERE"

    donc pas super
    Pas super en VB.Net, mais en C# il y a les string Verbatim pour ça

  7. #27
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Ca me semble étrange comme façon de procéder. Comme Guulh, je trouve qu'une string Verbatim est bien plus simple à utiliser tout en étant plus clair (pas de sb.Append de partout).
    Oui Storminonn

    Mais si un jour il est nécessaire (et ca arrivera) d'inserer une variable dans ta requete, toute ta belle construction verbatim s'effondre pour devenir vite un paquet de spagetti

    Je l'ai souvent vécu et c'est pourquoi j'utilise maintenant systématiquement le stringbuilder et c'est franchement pratique a l'usage

  8. #28
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par olibara Voir le message
    Oui Storminonn

    Mais si un jour il est nécessaire (et ca arrivera) d'inserer une variable dans ta requete, toute ta belle construction verbatim s'effondre pour devenir vite un paquet de spagetti
    Comme je l'ai dit, les requêtes paramétrées sont là pour ça à ce moment, enfin si c'est ce que tu entends par variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string query =
    @"SELECT * FROM MaTable
    WHERE IdTable = @MonId"
    @MonId est un paramètre dans la requête que tu pourras préciser à l'exécution de la requête.

  9. #29
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Pour BlueDeep et Stormimonn

    Citation Envoyé par Pol63
    donc nous partout dans notre code c'est

    dim rq as string = "" & VbCrlf & _
    "SELECT ch ... " & VbCrLf & _
    " FROM table" & VbCrLf & _
    " WHERE"
    donc pas super
    "

    Cet exemple etait de Pol63 a qui je répondais

  10. #30
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    c'est pas parce qu'on est sur le forum c# que je ne peux pas parler de vb.net
    et nous en vb on est obligé de faire un truc chiant ou d'utiliser un stringbuilder pour tapper moins de code
    mais pas de string sur plusieurs ligne de manière simple et lisible ...

    je demandais aussi à quoi servait le @ devant un string, chose qui n'a pas l'air d'exister en vb.net
    j'ai cru comprendre que ca servait à contrer le caractère \ qui serait chez vous un caracatère d'échapement (ca explique pourquoi je vois des c#iens écrires str = "c:\\monfichier.txt" alors qu'en vb.net un seul "\" suffit
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #31
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Pour Rassurer Stormimonn

    Meme en cas de requetre parametrée j'utilise un StringBuilder

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          sb.Append(" update Address set ");
          sb.Append(" PersonContactName=@Name");
          sb.Append(" where ID=@ID", ID);
     
          SqlCommand MyCmd = new SqlCommand();
     
          MyCmd.CommandText = sb.ToString();
          MyCmd.Parameters.AddWithValue("@ID", ID);
          MyCmd.Parameters.AddWithValue("@Name", name);
    Mais bon c'est une question de petite manies de chacun
    Personnellement pour la construction de requete Sql je ressens plus de confort avec le stringbuilder qu'avec le String verbatim

  12. #32
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    c'est une question de gout c'est sur, m'enfin utiliser append plutot qu'appendline par contre c'est pas terrible, pour du debug ta requete devient illisible
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #33
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par olibara Voir le message
    Pour Rassurer Stormimonn

    Meme en cas de requetre parametrée j'utilise un StringBuilder

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          sb.Append(" update Address set ");
          sb.Append(" PersonContactName=@Name");
          sb.Append(" where ID=@ID", ID);
    Que fait ce ",ID" ici ? Tu vois, cette façon de faire te perturbe
    Sans compter que si t'oublies un espace au début des tes chaînes, t'es foutu.(ou alors t'utilises appendline)

    On a certes tous nos manies, mais celle-là est inutilement compliquée. Elle t'oblige même à développer un add-in pour la satisfaire...

    Les StringBuilder ne sont pas faits pour concaténer un ensemble de chaînes connues dès la compil.

  14. #34
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    on ne peut pas faire de string multiligne en vb.net
    Sincères condoléances... Il fait si bon en c#...

  15. #35
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Que fait ce ",ID" ici ? Tu vois, cette façon de faire te perturbe
    Bien vu !
    Non non rassure toi pas du tout perturbé
    Je voulais illustrer une maniere de faire avec l'AppendFormat et je me suis emmelé les pinceaux en allant trop vite

    Bien vu aussi Pol63 le AppendLine serait plus approprié ici !

    On a certes tous nos manies, mais celle-là est inutilement compliquée. Elle t'oblige même à développer un add-in pour la satisfaire...
    Non !

    L'addin c'est surtout pour reformater les chaines sql pourries générees par SQL Mng Studio au autres

    Et tu peux facilement l'adapter pour generer un string verbatim

    Tiens le voilà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace SqlFormatter
    {
      class C_SqlFormat
      {
        // ********************************************************************
        public StringBuilder ParseSql(string src, bool StormiGuulh)
        {
          StringBuilder sb = new StringBuilder();
     
          if (StormiGuulh)
          {
            sb.Append("string StormiGuulh=@\"");
          }
          else
          {
            sb.AppendFormat("StringBuilder sb=new StringBuilder();");
            sb.Append(Environment.NewLine);
          }
          src = PrepareSplitRight(src, "SELECT");
          src = PrepareSplitRight(src, "FROM");
          src = PrepareSplitRight(src, "WHERE");
     
          src = PrepareSplitLeft(src, "AND");
          src = PrepareSplitLeft(src, "INNER");
          src = PrepareSplitLeft(src, "RIGHT");
          src = PrepareSplitLeft(src, "LEFT");
          src = PrepareSplitLeft(src, "FULL");
     
          string x = src.Replace(Environment.NewLine, "|").Replace(",", ",|");
     
          string[] item = x.Split('|');
          int i;
          for (i = 0; i < item.Length; i++)
          {
            string st = item[i].Trim();
            if (st.Length <= 0)
            {
              continue;
            }
            if (StormiGuulh)
            {
              sb.Append("   ");
              sb.AppendLine(st);
            }
            else
            {
              sb.AppendFormat("sb.Append(\" {0}\");{1}", st, Environment.NewLine);
            }
          }
          if (StormiGuulh)
          {
            sb.AppendLine("\";");
          }
          return sb;
        }
        // ********************************************************************
        private string PrepareSplitRight(string src, string key)
        {
          int pos = 0;
          while (true)
          {
            pos = src.IndexOf(key,pos, StringComparison.InvariantCultureIgnoreCase);
            if (pos < 0)
            {
              return src;
            }
            pos += key.Length;
            src=src.Insert(pos, "|");
            pos++;
          }
        }
        // ********************************************************************
        private string PrepareSplitLeft(string src, string key)
        {
          int pos = 0;
          while (true)
          {
            pos = src.IndexOf(key, pos, StringComparison.InvariantCultureIgnoreCase);
            if (pos < 0)
            {
              return src;
            }
            src = src.Insert(pos, "|");
            pos++;
            pos += key.Length;
          }
        }
      }
    }

  16. #36
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par olibara Voir le message
    public StringBuilder ParseSql(string src, bool StormiGuulh)


    J'utilisais Toad lors d'une mission, il le fait assez bien.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [AC-2007] Convertir un Recordset en Chaine Sql
    Par Abed_H dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/02/2010, 12h14
  2. Convertir chaines en float
    Par Nasky dans le forum C
    Réponses: 17
    Dernier message: 30/04/2006, 21h03
  3. [PL / SQL] Convertir chaine en tableau de char
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 06/02/2006, 10h29
  4. Convertir chaine de caractere
    Par Antoine NSG dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2005, 15h32
  5. [FLASH MX2004] Convertir chaine en date
    Par stip dans le forum Flash
    Réponses: 5
    Dernier message: 20/01/2005, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo