AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Die SQL-Syntax prüfen
Thema durchsuchen
Ansicht
Themen-Optionen

Die SQL-Syntax prüfen

Ein Thema von RWarnecke · begonnen am 12. Jul 2006 · letzter Beitrag vom 14. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Die SQL-Syntax prüfen

  Alt 12. Jul 2006, 14:44
Datenbank: ? • Version: ? • Zugriff über: ?
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Die SQL-Syntax prüfen

  Alt 12. Jul 2006, 15:29
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
Uwe
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Die SQL-Syntax prüfen

  Alt 12. Jul 2006, 15:34
Hallo,

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

Grüße vom marabu
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Die SQL-Syntax prüfen

  Alt 12. Jul 2006, 15:40
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.
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#5

Re: Die SQL-Syntax prüfen

  Alt 12. Jul 2006, 15:49
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Die SQL-Syntax prüfen

  Alt 12. Jul 2006, 15:50
Hallo Uwe,

du machst das so, weil du nicht mit GRANT und REVOKE arbeiten willst?

Bliebe immer noch die SQL Syntax-Prüfung.

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
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Die SQL-Syntax prüfen

  Alt 12. Jul 2006, 16:15
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.
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#8

Re: Die SQL-Syntax prüfen

  Alt 12. Jul 2006, 16:27
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Die SQL-Syntax prüfen

  Alt 12. Jul 2006, 16:52
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
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#10

Re: Die SQL-Syntax prüfen

  Alt 12. Jul 2006, 18:56
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 = 'mysqlthen
        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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz