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

VB.NET Discussion :

Erreur dans ma requête SQL [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut Erreur dans ma requête SQL
    Bonsoir a tous, les caractères spéciaux me donnent bien des soucis. J'avais déjà traité le caractère ' grâce a ma méthode d'extension "Escape" (voir ci-dessous).
    Voilà que je rencontre un autre caractère [ ou ] qui fait planter ma requette.
    En fait la variable OldPath contient des chemins d’accès donc je devrais pouvoir traiter tous les caractères pouvant faire partie d'un chemin.
    J'en profite également pour vous demander si je n'ai pas fait d'erreur avec le caractère % que j'ai ajouté a la fin car je maîtrise mal les synthaxe SQL. Le but est de sélectionner tous les chemins qui commence par le contenu de la variable OldPath.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                Dim dtPaths As DataTable = objDBDataSet.Tables(Tables.Paths)
                Dim drPaths() As DataRow
     
                Dim SQLOldPaths As String = TablePaths.PATH & " LIKE '" & OldPath.Escape & "%'"
                drPaths = dtPaths.Select(SQLOldPaths)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     <System.Runtime.CompilerServices.Extension()> _
        Public Function Escape(input As String) As String
            Return input.Replace("'", "''")
        End Function
    Merci beaucoup pour votre aide.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tout d'abord, ce que tu fais là, ce n'est pas du SQL... c'est le langage d'expression spécifique du DataSet, pour manipuler les données en mémoire.

    Pour échapper les caractères spéciaux, il faut les mettre entre crochets, justement. Donc par exemple si tu veux rechercher toutes les lignes où le nom contient "[toto]", il faut faire comme ça : "Name LIKE '%[[]toto[]]%'"

    Là tu ne vas pas t'en sortir avec des Replace, parce que si tu remplaces "[" par "[[]", quand tu vas ensuite remplacer "]" par "[]]", ça va foutre la zone... Essaie plutôt la méthode proposée ici : http://stackoverflow.com/a/2928226/98713

    En VB.NET ça donne ça :

    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
        <System.Runtime.CompilerServices.Extension()> _
        Public Function Escape(input As String) As String
            Dim sb As New StringBuilder(value.Length)
            For i As Integer = 0 To value.Length - 1
                Dim c As Char = value(i)
                Select Case c
                    Case "]"C, "["C, "%"C, "*"C
                        sb.Append("[").Append(c).Append("]")
                        Exit Select
                    Case "'"C
                        sb.Append("''")
                        Exit Select
                    Case Else
                        sb.Append(c)
                        Exit Select
                End Select
            Next
            Return sb.ToString()
        End Function

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Merci beaucoup Tomlev,
    J'ai un peu tendance a confondre le SQL et la synthaxe propre aux expressions, du coup il va falloir que je regarde ce point de plus prêt car j'utilise ma méthode Escape un peu partout dans mon code (de mémoire dans des méthodes DataTable ou DataView.Filter entre autres) du coup la méthode pour echapper des caractéres spéciaux n'est peut-être pas forcement la même je suppose.
    Je pense que je rajouterais un test comme ci-dessous avant de lancer la boucle For Next histoire d'optimiser un peu car c'est une fonction que je lance principalement dans les évenements FileSystemWatcher et plus c'est rapide mieux c'est.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Value.Contains("[") or ....then
    End if
    Je ferais un test ce soir, merci beaucoup.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par BasicZX81 Voir le message
    J'ai un peu tendance a confondre le SQL et la synthaxe propre aux expressions, du coup il va falloir que je regarde ce point de plus prêt car j'utilise ma méthode Escape un peu partout dans mon code (de mémoire dans des méthodes DataTable ou DataView.Filter entre autres) du coup la méthode pour echapper des caractéres spéciaux n'est peut-être pas forcement la même je suppose.
    Si, tout ça c'est la même syntaxe : DataColumn.Expression, DataView.RowFilter, BindingSource.Filter, DataTable.Select, etc

    Le SQL c'est juste pour les requêtes sur la base de données

    Citation Envoyé par BasicZX81 Voir le message
    Je pense que je rajouterais un test comme ci-dessous avant de lancer la boucle For Next histoire d'optimiser un peu car c'est une fonction que je lance principalement dans les évenements FileSystemWatcher et plus c'est rapide mieux c'est.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Value.Contains("[") or ....then
    End if
    .
    Pas sûr que ça te fasse gagner grand chose, parce que pour chaque caractère dont tu vas tester la présence, il faudra parcourir toute la chaine... A la rigueur tu peux le faire avec la méthode IndexOfAny, qui prend plusieurs caractères, mais je ne pense pas que ça vaille le coup.

    Par contre, le fait de rechercher dans un DataTable à chaque évènement du FileSystemWatcher, ça c'est lourd... il faut traiter très rapidement les évènements du FSW, sinon tu risques d'avoir un overflow, car les évènements sont stockés dans un buffer de taille très limitée, et on ne peut pas l'agrandir beaucoup car c'est dans une zone critique de la mémoire de l'OS.

    Le mieux, c'est de ne rien faire directement dans le handler de l'évènement, à part les ajouter les infos de l'évènement à une liste que tu traiteras dans un autre thread. Là tu n'est pas trop limité en terme de mémoire utilisée, donc tu peux te permettre de laisser la liste grossir un peu (enfin évidemment il faut quand-même pas qu'elle grossisse indéfiniment plus vite que tu ne peux la traiter...)

    Ca donne quelque chose comme ça :

    Code C# : 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
    private ConcurrentQueue<FileSystemEventArgs> _fileSystemEvents = 
        new ConcurrentQueue<FileSystemEventArgs>();
     
    private void fsw_Created(object sender, FileSystemEventArgs e)
    {
        _fileSystemEvents.Enqueue(e);
    }
     
    private void fsw_Changed(object sender, FileSystemEventArgs e)
    {
        _fileSystemEvents.Enqueue(e);
    }
     
    private void fsw_Deleted(object sender, FileSystemEventArgs e)
    {
        _fileSystemEvents.Enqueue(e);
    }
     
    private void fsw_Renamed(object sender, RenamedEventArgs e)
    {
        _fileSystemEvents.Enqueue(e);
    }
     
    bool _stopRequested;
    private void ProcessFileSystemEvents()
    {
        while (!_stopRequested)
        {
            FileSystemEventArgs e;
            if (_fileSystemEvents.TryDequeue(out e))
            {
                // Traiter l'évènement
                ...
            }
            else
            {
                // rien dans la file, on attend un peu
                Thread.Sleep(50);
            }
        }
    }
     
    private Thread _fileSystemEventsThread;
    private void StartProcessingFileSystemEvents()
    {
        _fileSystemEventsThread = new Thread(ProcessFileSystemEvents);
        _stopProcessing = false;
        _fileSystemEventsThread.Start();
    }
     
    private void StopProcessingFileSystemEvents()
    {
        _stopProcessing = true;
        _fileSystemEventsThread.Join();
    }

    EDIT: désolé, c'est du C#... normalement c'est pas très dur à traduire

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Bonsoir et merci beaucoup pour vos informations.
    J'avais beaucoup d'espoir que cela fonctionne mais j'ai un autre soucis et je ne comprends vraiment pas comment faire pour régler ce nouveau problème.
    La requette précédente avec l'opérateur LIKE fonctionne parfaitement avec la nouvelle méthode Escape, j'ai fait tous les tests nécessaire pour vérifier.
    Helas sur une autre ligne de mon code et avec l'opérateur = comme ci-dessous ma requette ne me renvoie aucune ligne (j'ai bien vérifié si ma table contient bien la ligne en question pour lever le doute).
    Du coup de je suis perdu, cela fait t'il une différence concernant les caractères spéciaux a échapper selon que l'on utilise l'opérateur = ou LIKE ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SQLPaths = TablePaths.ID_DOCUMENT & " = '" & ID_DOCUMENT.ToString & "' AND " & TablePaths.PATH & " = '" & Path.Escape & "'"
    drPaths = dtPaths.Select(SQLPaths)
     
    voici le contenu de SQLPath :
    ID_DOCUMENT = '1' AND PATH = 'D:\Toto. [[]tot2\toto Copie2.txt'
    et le chemin a trouver qui a été enregistré dans ma base (ce n'est pas un chemin trés réaliste mais c'est pour l'exemple):
    D:\Toto. [tot2\toto Copie2.txt
    Merci beaucoup pour une nouvelle aide.

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    J'ai trouvé ceci :
    Je vais devoir faire 2 méthodes je pense. Une méthode Escape comme j'avais fait avant et une méthode EscapeLikeValue comme proposé par tomlev.

    http://www.csharp-examples.net/dataview-rowfilter/

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

Discussions similaires

  1. [AC-2003] erreur dans une requête SQL
    Par sabredebois dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 25/12/2010, 19h57
  2. erreur dans une requête sql dans une fonction php
    Par frboyer dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2009, 13h37
  3. erreur dans votre requête SQL.Ponctuation invalide @ 48
    Par Artoisvert dans le forum Débuter
    Réponses: 0
    Dernier message: 11/07/2008, 02h12
  4. Erreur dans la requête SQL
    Par francommerce dans le forum ASP
    Réponses: 4
    Dernier message: 05/02/2008, 15h52
  5. [MySQL] Erreur dans une requête sql
    Par Goundy dans le forum PHP & Base de données
    Réponses: 37
    Dernier message: 30/01/2006, 16h08

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