2009-12-04 8 views
6

Je souhaiterais pouvoir analyser une instruction SQL SELECT arbitraire et récupérer les différentes parties du composant (colonnes, relations, conditions JOIN, conditions WHERE, colonnes ORDER BY), idéalement en utilisant Delphi. Une recherche rapide sur google montre plusieurs produits freeware différents, mais il n'est pas clair s'ils sont complets et/ou en développement actif. Mon besoin immédiat de simplement extraire la liste des relations utilisées dans une série de définitions VIEW afin de s'assurer que les vues ou les tables requises existent avant que j'essaie de CREER la vue. Ainsi, par exemple, pour la déclaration:Bibliothèque pour analyser les instructions SQL

SELECT PersonID, LastName, OrderID 
FROM People P INNER JOIN Orders O ON P.PersonID = O.PersonID 

Je dois récupérer les valeurs "People" et "Orders". (Évidemment, c'est un exemple simple: je veux être capable de gérer des cas plus complexes où, par exemple, le mot "FROM" pourrait apparaître dans la liste des colonnes dans le cadre d'une expression).

Je suis en train de fournir ce service dans une base de données qui permet d'utiliser des fonctions de STDCALL exportées de DLL, donc idéalement une bibliothèque candidat serait appelable de Delphi ou C

+0

Pouvez-vous me dire quel moteur SQL en utilisant votre? Sauf si je l'ai manqué. – Reallyethical

+0

Soyez heureux de, mais cela ne vous aidera pas. J'utilise R: Base. –

Répondre

6

Jetez un oeil à Gold Parser. Il a une Delphi version disponible, et grammaire SQL sur la page de téléchargement.

+0

Merci. Cela n'est pas apparu dans ma recherche google, sans doute parce que la partie SQL est sur une page séparée de l'analyseur et mentionne Delphi. –

+0

Oui, c'est un peu obscur. Bon système, cependant. –

0

parseurs SQL sont compliquées.

Pensiez-vous de cette approche:

  1. begin transaction.
  2. Envoyez la commande CREATE VIEW au serveur.
  3. attraper l'erreur (tout pilote de base de données décent devrait être capable de le faire).
  4. En cas d'erreur, analysez le message d'erreur et affichez les tables manquantes sur le client.
  5. rollback

voir cet exemple (PostgreSQL):

=> begin; 
BEGIN 
=> create view testview as select foo,bar from a join b on a.x=b.y; 
ERROR: relation "a" does not exist 
LINE 1: create view testview as select foo,bar from a join b on a.x=... 
                ^
=> rollback; 
ROLLBACK 

ou celui-ci (Oracle):

SQL> create view testview as select foo,bar from a join b on a.x=b.y; 
create view testview as select foo,bar from a join b on a.x=b.y 
                * 
ERROR at line 1: 
ORA-00942: table or view does not exist 

SQL> rollback; 

Rollback complete. 
+0

Oui, c'est ce que je fais actuellement. Si je peux détecter des problèmes au moment de créer mon fichier de définition de structure à partir de la base de données d'origine, je peux résoudre certains d'entre eux immédiatement (essentiellement, j'essaye d'effectuer une fermeture transitive sur toutes les définitions de vue dans la base de données. le SGBD ne fonctionne malheureusement pas en fournissant une liste de vues). –

+0

Ha. C'est vraiment un hack, mais amusant. Malheureusement, l'affiche n'a pas dit qu'il avait même un serveur de base de données avec lequel travailler.Avant d'essayer quelque chose comme ça, assurez-vous d'enquêter sur les vecteurs de menace potentiels! – Dolph

+0

Je suis corrigé de ne pas avoir de DB. Tu as posté pendant que je tapais ma réponse, Larry. :) – Dolph

0

Vous pouvez utiliser Delphi avec ADODB.

Utilisez un TADOQuery pour tester si votre requête est bonne ou non sans vraiment ouvrir le jeu d'enregistrements. Vous pouvez également récupérer les noms des champs de la requête.

Suppression d'une connexion TADOConnection sur un formulaire. Déposez une TMemo et un TButton et essayez ce code:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    lADOQuery : TADOQuery; 
    lFieldNames : TStrings; 
begin 
    lADOQuery := TADOQuery.Create(nil); 
    try 
    lADOQuery.Connection := ADOConnection1; 
    lADOQuery.SQL.Text := Memo1.Text; 
    lFieldNames := TStringList.create; 
    try 
     lADOQuery.GetFieldNames(lFieldNames); 

     showmessage(lFieldNames.Text); // Show fieldNames of the query 

     // To show that the dataset is not actually opened try this : 
     // Throws an exception (Dataset closed) 
     //showmessage(inttostr( lADOQuery.RecordCount)); 
    except 
     On e: Exception do 
     ShowMessage('Invalid query'); 
    end; 
    lFieldNames.free; 
    finally 
    lADOQuery.free; 
    End; 
end; 
+0

Mon SGBD n'est pas accessible avec ADO. –

Questions connexes