6
votes

Bibliothèque d'analyser les déclarations SQL

J'aimerais pouvoir analyser une instruction SQL arbitraire SELECT et récupérer les différentes pièces composantes (colonnes, relations, conditions de jointure, où les conditions, l'ordre des colonnes), idéalement à l'aide de Delphi. Une recherche Google rapide affiche plusieurs produits libres différents, mais ce n'est pas clair si elles sont complètes et / ou sous un développement actif.

Mes besoin immédiat de simplement extraire la liste des relations utilisées dans une série de définitions de visualisation afin de garantir que Les vues ou tables requises existent avant que j'essaie de créer la vue. Ainsi, par exemple, pour la déclaration: xxx

Je dois récupérer les valeurs "personnes" et "commandes". (Évidemment, c'est un exemple simple. Je veux pouvoir gérer des cas plus complexes où, par exemple, le mot "de" peut apparaître dans la liste de colonnes dans le cadre d'une expression).

i 'M Essayant de fournir ce service dans une base de données permettant d'utiliser des fonctions STDCALL exportées à partir de DLL, de sorte que toutes les bibliothèques candidates seraient appelées à partir de Delphi ou C.


2 commentaires

Pouvez-vous éventuellement me dire quel moteur SQL vous utilisez? Sauf si je l'ai manqué.


Soyez heureux de, mais cela ne vous aidera pas. J'utilise r: base.


3 Réponses :


0
votes

Les analyseurs SQL sont compliqués.

Avez-vous pensé à une telle approche:

  1. commence la transaction.
  2. Envoyez la commande Create View au serveur.
  3. attrape l'erreur (tout pilote de base de données décent devrait pouvoir le faire).
  4. S'il y a eu une erreur, analysez le message d'erreur et affichez les tables manquantes au client.
  5. Rollback

    Voir cet exemple (postgreSQL): xxx

    ou celui-ci (oracle): xxx


4 commentaires

Oui, c'est ce que je fais actuellement. Si je peux détecter des problèmes au moment où je crée 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'essaie d'effectuer une fermeture transitive dans toutes les définitions d'affichage de la base de données, qui Les DBMS ne font malheureusement pas lors de la fourniture d'une liste de vues).


Ha. C'est définitivement un piratage, mais amusant. Malheureusement, l'affiche n'a pas dit qu'il avait même eu un serveur de base de données en cours de fonctionnement. Avant d'essayer quelque chose comme ça, assurez-vous d'enquêter sur des vecteurs potentiels de menace!


Je suis corrigé de ne pas avoir de dB. Vous avez posté pendant que je tapais ma réponse, Larry. :)


Non, Dolph, tu étais réellement juste. Je n'ai pas de serveur en cours d'exécution, le problème que je traite en ce moment implique une base de données de type de serveur de fichiers. Mais le problème est assez général qu'il ne devrait pas vraiment être spécifique à la base de données.



6
votes

Jetez un coup d'œil à Parser Gold. Il a une version Delphi disponible et SQL Grammar sur la page de téléchargement.


3 commentaires

Merci. Cela ne s'est pas présenté dans ma recherche Google, vraisemblablement parce que la partie SQL est sur une page séparée de l'analyseur et de la Delphi Mentions.


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


Lien mort. Le site est en baisse (" travail en cours. ")



0
votes

Vous pouvez utiliser Delphi avec Adodb.

Utilisez une tadoquery pour tester si votre requête est bonne ou non sans ouvrir vraiment le jeu d'enregistrements. Votre peut également revenir sur les noms de champs de la requête. p>

déposer une tadoconnection sur un formulaire. Déposez un TMEMO et un TBUTTON et essayez ce code: P>

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;


1 commentaires

Mon SGBD n'est pas accessible en utilisant ADO.