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: p> 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). P> 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. P> P>
3 Réponses :
Les analyseurs SQL sont compliqués.
Avez-vous pensé à une telle approche: p>
Voir cet exemple (postgreSQL): p> ou celui-ci (oracle): p>
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.
Jetez un coup d'œil à Parser Gold. Il a une version Delphi disponible et SQL Grammar sur la page de téléchargement. p>
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. I>")
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;
Mon SGBD n'est pas accessible en utilisant ADO.
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.