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 :

Caractère d'échappement inopérant


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 212
    Par défaut Caractère d'échappement inopérant
    Bonjour,

    J'utilise Dataview pour trier mon Dataset.
    Je doit trier des éléments selon leur catégorie( NomCat), et une des catégories se nomme "Oeuvres d'art".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArticleDataSet.Tables[0].DefaultView.RowFilter = CMDFilter;
    avec CMDFilter = "NomCat = 'Décoration\Oeuvres d'art'"

    Ceci déclenche une exception à cause de l'apostrophe à "d'art" : System.Data.SyntaxErrorException*: 'Erreur de syntaxe : opérande manquant après l'opérateur 'art'.'

    Or je n'arrive pas à insérer un caractère d'échappement dans mon expression CMDFilter.
    La commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CMDFilter = CMDFilter.Replace("'","\'");
    ne modifie strictement rien.

    Merci pour votre aide

  2. #2
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 212
    Par défaut
    Mon problème (tel que je l'analyse) est que mon caractère d’échappement n'atteint jamais le rowfilter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArticleDataSet.Tables[0].DefaultView.RowFilter = CMDFilter;
    Tout est trop tôt interprété et "\'" devient donc logiquement "'". Dès que la valeur de la chaîne est assignée à la variable CMDFilter.

    Pour info, auparavant j'utilisais une requête SQL et le "NomCat" était passé en paramètre.
    À présent, je ne modifie pas le contenu du dataset, et souhaite juste agir sur le DataView.
    D'où ce problème que je rencontre.

    Devrais-je changer "en dur" tous les "'" des noms de catégories par "/" ou "_" dans la BdD ou il y-a-t'il un moyen de s'en sortir ?

  3. #3
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 212
    Par défaut
    Bon, la solution est très bête.

    Il suffit de remplacer ' par '' (deux guillemets simples).
    Dans mon cas "d'art" devient donc "d''art". Pfff !

    Une méthode déjà prête est donnée sur
    https://www.csharp-examples.net/dataview-rowfilter/

    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
     
    public static string EscapeLikeValue(string valueWithoutWildcards)
    {
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < valueWithoutWildcards.Length; i++)
      {
        char c = valueWithoutWildcards[i];
        if (c == '*' || c == '%' || c == '[' || c == ']')
          sb.Append("[").Append(c).Append("]");
        else if (c == '\'')
          sb.Append("''");
        else
          sb.Append(c);
      }
      return sb.ToString();
    }
    ET aussi ne pas utiliser "=" mais "LIKE" !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            public string TriNodesRecursive(TreeNode oParentNode)
            {
                Console.WriteLine("TriNodesRecursive : " + oParentNode.Name);
     
                string CMDRecurs = "'" + EscapeLikeValue(oParentNode.Name.Trim()) + "'"; // Nettoie la chaîne pour rowfilter (d'art --> d''art)
     
                foreach (TreeNode oSubNode in oParentNode.Nodes)
                {
                    CMDRecurs = CMDRecurs + " OR " + "NomCat LIKE '" + EscapeLikeValue(oSubNode.Name.Trim()) + "'";
                }
                return CMDRecurs;
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [...]
                        string CMDFilter = "NomCat LIKE " + CMDRecurs ;
                        ArticleDataSet.Tables[0].DefaultView.RowFilter = CMDFilter;
    Résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. caractère d'échappement pour un '
    Par alexfrere dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 04/07/2006, 11h07
  2. caractère d'échappement de '['
    Par Ecibat dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 19/12/2005, 14h27
  3. Caractères d'échappement
    Par dl_jarod dans le forum ASP
    Réponses: 2
    Dernier message: 26/10/2005, 10h36
  4. caractéres d'échappements
    Par kleenex dans le forum Access
    Réponses: 3
    Dernier message: 27/09/2005, 12h46

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