![]() |
Datenbank: ? • Version: ? • Zugriff über: ?
Die SQL-Syntax prüfen
Hallo,
ich schreibe gerade an einem Assistenten, um Tabellen in einer Datenbank zu erstellen. Er funktioniert auch schon so einigermassen. Nur habe ich festgestellt, dass zum Beispiel bei MySQL ein INT-Feld, welches Auto_Increment ist auch als Schlüssel gesetzt werden muss. Nun möchte ich vorher, bevor der SQL-Befehl an den Server geschickt wird dieses Überprüfen. Die jetzige Ablaufreinfolge sieht so aus :
Ich führe alle SQL-Befehle über das Hauptprogramm aus. Wo und wie kann ich jetzt die Überprüfung des SQL-Befehls reinsetzen. Er soll nur überprüft werden und nicht ausgeführt werden. Das sollte am besten zwischen Punkt 5 und 6 geschehen, nach meiner Ansicht. |
Re: Die SQL-Syntax prüfen
Hi Rolf,
in meinem Programm habe ich einen kleinen SQL Editor, in einem TSynEdit (Memo) wird der SQL String eingegeben. Das ausführen des SQL Befehls wird über einen Button gestartet und genau da überprüfe ich vorher ob Befehle von diesem Benutzer ausgeführt werden dürfen. Bsp:
Delphi-Quellcode:
So sollte es doch auch bei Dir funktionieren
S :=Uppercase(Query.Sql.Text);
if ((Pos('INSERT',S)>0) or (Pos('UPDATE',S)>0) or (Pos('DELETE',S)>0) or (Pos('DROP',S)>0) or (Pos('ALTER',S)>0) or (Pos('CREATE',S)>0)) then begin Tu was end; |
Re: Die SQL-Syntax prüfen
Hallo,
geht es denn hier um Berechtigungen oder ist ein SQL Syntax Check gemeint? Grüße vom marabu |
Re: Die SQL-Syntax prüfen
Bei meinem Beispiel prüfe ich die SQL Anweisung auf Befehle die nicht ausgeführt werden sollen.
Man kann ja auch hier einen Syntaxcheck ausführen, wie gesagt war nur ein Beispiel. |
Re: Die SQL-Syntax prüfen
Es geht hier um den Syntax-Check und nicht um Berechtigungen. Ich möchte eine vorherige Überprüfung des SQL-Befehls haben, bevor ich den an den Server sende. Gibt es dazu eine Komponete oder Unit, die zu den einzelnen Datenbanken die Regel überprüft ?
|
Re: Die SQL-Syntax prüfen
Hallo Uwe,
du machst das so, weil du nicht mit GRANT und REVOKE arbeiten willst? Bliebe immer noch die SQL Syntax-Prüfung. Zitat:
Gruß marabu |
Re: Die SQL-Syntax prüfen
Hallo Uwe,
ich schliesse mich marabu an. Die Prüfung kann eigentlich nur vom Server erfolgen. Selbst, wenn syntaktisch Alles richtig ist, wirst du auch dann eine Exception erhalten, wenn du z.B. nicht existierende Tabellennamen angibst. Deshalb sollte man einfach das Prepare oder Open in einem try except ausführen und den Fehler des Servers dann ausgeben. Frank [EDIT] Sieh dir z.B. IBExpert mal an. Da wird der SQL Befehl zum Erstellen der Tabellen vom Programm erzeugt und ist somit immer richtig. Der Benutzer kann im Dialog seine Parameter eingeben und fertig. |
Re: Die SQL-Syntax prüfen
Ok, das ist mir soweit klar, dass ich die SQL-Syntax vom Server prüfen lassen sollte. Ich führe den SQL-Befehl schon in einem try..except-Block aus. Nur dieser steht im Hauptprogramm. Wie könnte ich dann wieder den Assistent-Dialog anzeigen lassen, wenn er in den Except-Teil reingeht, mit den Werten die ich vorher eingegeben habe. Die Form des Assistenten is bsDialog und der Button Fertig hat ModalResult mbOK.
|
Re: Die SQL-Syntax prüfen
Zitat:
Frank |
Re: Die SQL-Syntax prüfen
Mein Dialogfenster wird nicht zerstört. Ich habe das mal in dieser Procedure ausprobiert, nur habe ich leider im Moment keine Idee, wie ich es machen soll. Das ist meine Procedure:
Delphi-Quellcode:
Das eingefügte funktioniert auch wunderbar, nur wie verpacke ich das jetzt in eine Endlosschleife, dass immer wieder versucht wird die Tabelle zu erstellen oder bis ich den Button "Abbrechen" anklicke ?
procedure TSQLTalkerMain.CreateTableExecute(Sender: TObject);
var CreateTableMain: TCreateTableMain; begin // Sollte noch kein Fenster offen sein, dann wird jetzt eines geöffnet SQLCommand := ZeosDataModule.ZConnection.Protocol; CreateTableMain := TCreateTableMain.Create(Application); CreateTableMain.ShowModal; if CreateTableMain.ModalResult = mrOK then begin // Sollte noch kein Fenster offen sein, dann wird jetzt eines geöffnet CreateSQLChild; try with ZeosDataModule.TempQuery do begin if ZeosDataModule.ZConnection.Protocol = 'mysql' then begin SQL.Clear; SQL.Add(SQLCommand); MainEdit.SynEditMemo.Lines.Clear; MainEdit.SynEditMemo.Lines.Text := ZeosDataModule.TempQuery.SQL.Text; ExecSQL; ListViewTables.Items.Clear; SQL.Clear; SQL.Add('SHOW TABLES FROM ' + Copy(TreeViewDatabase.Selected.Text, 0, posn('(', TreeViewDatabase.Selected.Text, 1) - 2) + ';'); Open; Active := true; while not EOF do begin ListViewTables.Items.Add(Fields[0].AsString); next; end; Active := False; TreeViewDatabaseClick(Sender); end; end; except on e: Exception do begin MessageDlg('Es ist ein Fehler bei der Erstellung der Tabelle aufgetreten !!' + #13 + e.Message, mtError, [mbOk], 0); CreateTableMain.ShowModal; //<--- Dieses habe ich jetzt eingefügt. end; end; end; // IF-Abfrage auf's ModalResult end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz