Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Die SQL-Syntax prüfen (https://www.delphipraxis.net/73107-die-sql-syntax-pruefen.html)

RWarnecke 12. Jul 2006 14:44

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 :
  • [1]Starte den Assistenten im Hauptprogramm über ein PopUp-Menü (Assistent ist in einer extra Unit)
    [2]Fülle die Felder in dem Assistenten aus
    [3]Klicke auf den Fertig-Button
    [4]Nun wird der SQL-Befehl laut meinen Eingaben zusammengesetzt
    [5]Der zusammengesetzte Befehl wird an das Hauptprogramm übergeben
    [6]Das Assistentenfenster wird geschlossen
    [7]Der SQL-Befehl wird im Hauptprogramm ausgeführt.

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.

uwewo 12. Jul 2006 15:29

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:
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;
So sollte es doch auch bei Dir funktionieren

marabu 12. Jul 2006 15:34

Re: Die SQL-Syntax prüfen
 
Hallo,

geht es denn hier um Berechtigungen oder ist ein SQL Syntax Check gemeint?

Grüße vom marabu

uwewo 12. Jul 2006 15:40

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.

RWarnecke 12. Jul 2006 15:49

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 ?

marabu 12. Jul 2006 15:50

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:

Zitat von RWarnecke
Nun möchte ich vorher, bevor der SQL-Befehl an den Server geschickt wird dieses Überprüfen.

Ich würde die Syntaxprüfung vom Server durchführen lassen. T-SQL kennt da den Schalter NOEXEC, bei MySQL könnte man PREPARE verwenden.

Gruß

marabu

dataspider 12. Jul 2006 16:15

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.

RWarnecke 12. Jul 2006 16:27

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.

dataspider 12. Jul 2006 16:52

Re: Die SQL-Syntax prüfen
 
Zitat:

Zitat von RWarnecke
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.

Wenn das Dialogfenster nicht zerstört wird, dann sind doch alle Daten noch vorhanden. Somit reicht ein erneutes ShowModal.

Frank

RWarnecke 12. Jul 2006 18:56

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:
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;
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 ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 Uhr.
Seite 1 von 2  1 2      

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