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 :

Regex, requête SQL


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 96
    Par défaut Regex, requête SQL
    Bonjour à tous,

    Je suis en train de chercher comment faire une regex pour récupérer les tables d'une requête SQL.

    Exemple :

    SELECT * FROM Client. Ma regex est : @"SELECT\s+.*FROM\s+(?<tableName>[A-Za-z0-9_\.]+)";

    et elle me sort bien "Client" !

    J'aimerai néanmoins que cette regex soit fonctionnelle pour TOUTES les requêtes SQL. C'est à dire :

    SELECT * FROM Client, fournisseur : client fournisseur

    SELECT * FROM (Client Inner Join Fournisseur On Fournisseur.Client_id = Client.id) : client fournisseur

    Est ce que par hasard vous en avez une sous la main ?

    Merci beaucoup

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Tu pourrais faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT\s+.*FROM\s+\(?(?<tableName>[A-Za-z0-9_\.]+)(\s+inner\s+join\s+(?<tableName>[A-Za-z0-9_\.]+))?
    Mais tu vas peut-être devoir faire plusieurs regex différents selon les cas que tu vas rencontré.

    As-tu vraiment besoin d'un regex universel pour gérer même les cas que tu ne rencontrera pas? Je ne connais pas le contexte, alors je m'avances un peu...

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 96
    Par défaut
    Citation Envoyé par PatteDePoule Voir le message
    Tu pourrais faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT\s+.*FROM\s+\(?(?<tableName>[A-Za-z0-9_\.]+)(\s+inner\s+join\s+(?<tableName>[A-Za-z0-9_\.]+))?
    Mais tu vas peut-être devoir faire plusieurs regex différents selon les cas que tu vas rencontré.

    As-tu vraiment besoin d'un regex universel pour gérer même les cas que tu ne rencontrera pas? Je ne connais pas le contexte, alors je m'avances un peu...
    Salut PatteDePoule,

    D'une part merci de ton aide ! Le contexte est assez simple et en même temps compliqué.

    En fait, le logiciel de ma boite créer des "Univers" a partir de base de données. Par exemple une base de données qui contient Agence, Voiture, Vendeur, Moteur, TVA etc. Je veux faire un univers 'Auto concession' dans lequel je vais mettre Agence Voiture et Vendeur, les autres tables ne m'intéresse pas.

    Le problème est que ces univers peuvent être fait sur des tables Mysql, sql serveur, access...
    Mon travail consiste a créer une phase intermédiaire au chargement d'un univers qui consisterai a "filtrer" des données suivant les désires d'un utilisateur : Exemple, dans la tables Agence, il ne veut pas le numéro de vente des voitures. Donc pour cela je récupère le schéma des tables de la requête de l'univers, j'affiche les colonnes sous forme de checkbox, et je refais une requête temporaire qui va me charger uniquement les données nécessaires pour l'utilisateur en cours.

    Donc il me faut une méthode pour récupérer le schéma des tables de la requête (ce qui est déjà fait), et une méthode pour récupérer les tables de la requête sql qui devait charger l'univers. Pour ça j'ai choisi les regex et cette façon de procéder :

    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
     
            public List<string> ObtenirSchemaDUne(string requete)
            {
                List<string> listeColonnes = new List<string>();
                RequeteDynamique rd = new RequeteDynamique();
                string REGEX_TABLE_NAME = @"SELECT\s+.*FROM\s+(?<tableName>[A-Za-z0-9_\.]+)";
     
                Match m = Regex.Match(requete, REGEX_TABLE_NAME, RegexOptions.Multiline | RegexOptions.IgnoreCase);
                for (int i = 0; i < m.Groups.Count; i ++)
                {
                    string tableName = m.Groups["tableName"].Value;
     
                    using (SqlCeCommand command = new SqlCeCommand(rd.CreerRequeteStructure(tableName), _connection))
                    {
                        using (SqlCeDataReader reader = command.ExecuteReader())
                        {
                            listeColonnes.AddRange(ExecuterCommande(reader, command));
                        }
                    }
                }
                return listeColonnes;
            }
    Cette méthode n'est pas encore fonctionnelle, mais c'était pour t'expliquer plus en détails mon idée. Si tu en as une meilleur, je suis preneur !

Discussions similaires

  1. Regex pour filtrer une requête SQL
    Par selenar dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 04/02/2012, 16h07
  2. [Regex]récupérer la table dans une requête sql
    Par laedit dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 11/09/2009, 16h28
  3. Réponses: 2
    Dernier message: 10/04/2007, 11h46
  4. Regex pour nettoyer des requêtes SQL
    Par gaboo_bl dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 26/03/2007, 12h03
  5. [RegEx] Requête SQL sur tables non connues à l'avance (regex)
    Par lothar59 dans le forum Langage
    Réponses: 2
    Dernier message: 27/02/2007, 10h33

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