Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fehler in SQL-Syntax (https://www.delphipraxis.net/193880-fehler-sql-syntax.html)

Delbor 19. Sep 2017 11:33

Datenbank: SQLite • Version: 3 • Zugriff über: FireDac

Fehler in SQL-Syntax
 
Hi zusammen
Die Fehlermeldung:
Zitat:

---------------------------
Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse ESQLiteNativeException mit der Meldung '[FireDAC][Phys][SQLite] ERROR: near "KEY": syntax error' aufgetreten.
---------------------------
Und die auslösende Methode:
Delphi-Quellcode:
function TDMLSQLite.CreateTblHtml :String;  // "ContentMasterData".    ContentMasterData.
 var SQLString: String;
begin
 SQLString := 'CREATE TABLE tbl_Html('+
                  'idHtml INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,'+
                  'MenueCSS INTEGER NOT NULL CHECK(MenueCSS>=0),'+
                  'PageCSS INTEGER NOT NULL CHECK(PageCSS>=0),'+
                  'MenueID INTEGER NOT NULL CHECK(MenueID>=0),'+
                  'HTMLPage LONGTEXT NOT NULL,'+
                  'URL VARCHAR(45) NOT NULL,'+
                  'tbl_Javascript_idJavascript INTEGER NOT NULL,'+
                  'tbl_CSS_idCSS INTEGER NOT NULL CHECK(tbl_CSS_idCSS>=0),'+
                  'tblgalerie_Gallery_ID INTEGER NOT NULL CHECK(tblgalerie_Gallery_ID>=0),'+
                  'CONSTRAINT fk_tbl_Html_tbl_Javascript1'+
                    'FOREIGN KEY(tbl_Javascript_idJavascript)'+
                    'REFERENCES tbl_Javascript(idJavascript),'+
                  'CONSTRAINT fk_tbl_Html_tbl_CSS1'+
                    'FOREIGN KEY(tbl_CSS_idCSS)'+
                    'REFERENCES tbl_CSS(idCSS),'+
                  'CONSTRAINT fk_tbl_Html_tblgalerie1'+
                    'FOREIGN KEY(tblgalerie_Gallery_ID)'+
                    'REFERENCES tblgalerie(Gallery_ID))';
 Result := SQLString;
end;
Das ist die Fortsetzung aus diesem Thread. Der Aufruf der obigen function geschieht, wie mir da vorgeschlagen wurde:
Delphi-Quellcode:
  procedure TDMLSQLite.ContentmasterDBCreate2;
  begin
    if ConnectContentmasterDB then
    begin
      if ExecuteSQL(CreateTbl_Bld) then
      if ExecuteSQL(CreateTbl_Galery) then
      if ExecuteSQL(CreateTbl_Album) then
      if ExecuteSQL(CreateTbl_bildtext) then
      if ExecuteSQL(CreateTblCSS) then
      if ExecuteSQL(CreateTblJavascript) then
      if ExecuteSQL(CreateTblHtml) then     //<<===
....
    end;
  end;
"Corpus Delicti" ist der 7. Aufruf. Ich hatte da auch schon eine fehlende abschliessende Klammer bemerkt, aber bei diesem Fehler bin ich nun echt ratlos.
Im folgenden noch die Funktion, wie sie von MySQL-Workbench exportiert wurde:
Delphi-Quellcode:
CREATE TABLE "ContentMasterData"."tbl_Html"(
  "idHtml" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  "MenueCSS" INTEGER NOT NULL CHECK("MenueCSS">=0),
  "PageCSS" INTEGER NOT NULL CHECK("PageCSS">=0),
  "MenueID" INTEGER NOT NULL CHECK("MenueID">=0),
  "HTMLPage" LONGTEXT NOT NULL,
  "URL" VARCHAR(45) NOT NULL,
  "tbl_Javascript_idJavascript" INTEGER NOT NULL,
  "tbl_CSS_idCSS" INTEGER NOT NULL CHECK("tbl_CSS_idCSS">=0),
  "tblgalerie_Gallery_ID" INTEGER NOT NULL CHECK("tblgalerie_Gallery_ID">=0),
  CONSTRAINT "fk_tbl_Html_tbl_Javascript1"
    FOREIGN KEY("tbl_Javascript_idJavascript")
    REFERENCES "tbl_Javascript"("idJavascript"),
  CONSTRAINT "fk_tbl_Html_tbl_CSS1"
    FOREIGN KEY("tbl_CSS_idCSS")
    REFERENCES "tbl_CSS"("idCSS"),
  CONSTRAINT "fk_tbl_Html_tblgalerie1"
    FOREIGN KEY("tblgalerie_Gallery_ID")
    REFERENCES "tblgalerie"("Gallery_ID")
);
Was habe ich übersehen?

Gruss
Delbor

Aviator 19. Sep 2017 11:38

AW: Fehler in SQL-Syntax
 
Also ich habe das Statement gerade mal in einem SQLite Manager mit einer neuen Datenbank ausgeführt. Das lief ohne Probleme. Das Statement als solches scheint zumindest mal in Ordnung zu sein.

Fritzew 19. Sep 2017 11:38

AW: Fehler in SQL-Syntax
 
Zitat:

'CONSTRAINT fk_tbl_Html_tbl_Javascript1'+
'FOREIGN KEY(tbl_Javascript_idJavascript)'+
Was macht der Compiler wohl daraus?

'CONSTRAINT fk_tbl_Html_tbl_Javascript1FOREIGN KEY(tbl_Javascript_idJavascript)'

Aviator 19. Sep 2017 11:41

AW: Fehler in SQL-Syntax
 
Zitat:

Zitat von Fritzew (Beitrag 1381579)
Zitat:

'CONSTRAINT fk_tbl_Html_tbl_Javascript1'+
'FOREIGN KEY(tbl_Javascript_idJavascript)'+
Was macht der Compiler wohl daraus?

'CONSTRAINT fk_tbl_Html_tbl_Javascript1FOREIGN KEY(tbl_Javascript_idJavascript)'

Möp. Der Kandidat hat 100 Punkte würde ich mal behaupten. Ich habe mir unten das Statement kopiert und da sind die Umbrüche natürlich enthalten.

Aber meine Aussage stimmt ja trotzdem. Das Statement aus solches funktioniert und ist korrekt. :-D

TigerLilly 19. Sep 2017 11:43

AW: Fehler in SQL-Syntax
 
Ich bin sehr sicher, dass da

> 'CONSTRAINT fk_tbl_Html_tblgalerie1'+
> 'FOREIGN KEY(tblgalerie_Gallery_ID)'+

ein Leerzeichen fehlt + zusammengesetzt dieses draus wird

> 'CONSTRAINT fk_tbl_Html_tblgalerie1FOREIGN KEY(tblgalerie_Gallery_ID)'+

HTH

bra 19. Sep 2017 11:45

AW: Fehler in SQL-Syntax
 
Darum am besten am Ende oder Anfang jeder Zeile ein Leerzeichen einfügen.

nahpets 19. Sep 2017 12:21

AW: Fehler in SQL-Syntax
 
Um solchen Fehlern aus dem Weg zu gehen, nehme ich da immer Stringlisten. Der zusätzliche Schreibaufwand ist deutlich geringer als die Zeit, die man zur Fehlersuche benötigt.
Delphi-Quellcode:
function TDMLSQLite.CreateTblHtml :String; // "ContentMasterData". ContentMasterData.
  var SQLString: TStringList;
begin
  SQLString := TStringList.Create;
  SQLString.Add('CREATE TABLE tbl_Html(');
  SQLString.Add(' idHtml INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,');
  SQLString.Add(' MenueCSS INTEGER NOT NULL CHECK(MenueCSS>=0),');
  SQLString.Add(' PageCSS INTEGER NOT NULL CHECK(PageCSS>=0),');
  SQLString.Add(' MenueID INTEGER NOT NULL CHECK(MenueID>=0),');
  SQLString.Add(' HTMLPage LONGTEXT NOT NULL,');
  SQLString.Add(' URL VARCHAR(45) NOT NULL,');
  SQLString.Add(' tbl_Javascript_idJavascript INTEGER NOT NULL,');
  SQLString.Add(' tbl_CSS_idCSS INTEGER NOT NULL CHECK(tbl_CSS_idCSS>=0),');
  SQLString.Add(' tblgalerie_Gallery_ID INTEGER NOT NULL CHECK(tblgalerie_Gallery_ID>=0),');
  SQLString.Add('CONSTRAINT fk_tbl_Html_tbl_Javascript1');
  SQLString.Add(' FOREIGN KEY(tbl_Javascript_idJavascript)');
  SQLString.Add(' REFERENCES tbl_Javascript(idJavascript),');
  SQLString.Add('CONSTRAINT fk_tbl_Html_tbl_CSS1');
  SQLString.Add(' FOREIGN KEY(tbl_CSS_idCSS)');
  SQLString.Add(' REFERENCES tbl_CSS(idCSS),');
  SQLString.Add('CONSTRAINT fk_tbl_Html_tblgalerie1');
  SQLString.Add(' FOREIGN KEY(tblgalerie_Gallery_ID)');
  SQLString.Add(' REFERENCES tblgalerie(Gallery_ID))';
  Result := SQLString.Text;
  SQLString.Free;
end;
Und schlechter zu lesen ist es auch nicht.

Delbor 19. Sep 2017 12:47

AW: Fehler in SQL-Syntax
 
Hi zusammen

Vielen Dank an euch alle!! Ich hätte das noch öfters übersehen, trotz Vergleichen mit dem Original-Export!
Delphi-Quellcode:
'tbl_CSS_idCSS INTEGER NOT NULL CHECK(tbl_CSS_idCSS>=0),'+
'tblgalerie_Gallery_ID INTEGER NOT NULL CHECK(tblgalerie_Gallery_ID>=0),'+
'CONSTRAINT fk_tbl_Html_tbl_Javascript1'+
  'FOREIGN KEY(tbl_Javascript_idJavascript)'+
  'REFERENCES tbl_Javascript(idJavascript),'+
'CONSTRAINT fk_tbl_Html_tbl_CSS1'+
  'FOREIGN KEY(tbl_CSS_idCSS)'+
  'REFERENCES tbl_CSS(idCSS),'+
Nach euren Rückmeldungen fällt mir jetzt auf: Die Zeilen oberhalb der Constraintsangaben enden alle mit ",'+", haben also auch keine Leerzeichen - dafür mit dem Komma aber ein Trennzeichen, so dass der Compiler nicht "an der Nase herumgeführt" werden kann.

Zu Nahpeds Vorschlag mit der Stringliste: Mal sehen, ob ich mir das angewöhnen kann...

Nachtrag:
Zitat:

Der zusätzliche Schreibaufwand ist deutlich geringer als die Zeit, die man zur Fehlersuche benötigt.
Gerade bei solch importierten Scripten schauert mich eigentlich der Gedanke etwas, für jedes einzelne Statement einen Funktionskopf zu schreiben - und zu wohl 80 - 90% immer dasselbe eintippen zu müssen.
Meine Lösung dafür: Eine Quelltextvorlage. Die kan dann auch gleich das Handling mit der Stringliste enthalten. Der Rest ist Copy&Paste und Drag&Drop...

Gruss
Delbor

Uwe Raabe 19. Sep 2017 12:51

AW: Fehler in SQL-Syntax
 
Liste der Anhänge anzeigen (Anzahl: 2)
Solche SQL Skripte editiere ich gerne in einer separaten Textdatei mit Extension SQL. Da bekomme ich in der IDE nämlich auch gleich eine entsprechende Syntaxhervorhebung. Passt dann alles, wird der Text über Copy und MultiPaste (im Menü Bearbeiten - Mehrfach einfügen) mit dem entsprechenden Prefix/Postfix versehen eingefügt. Dann muss lediglich noch am Ende etwas korrigiert werden.

haentschman 19. Sep 2017 12:59

AW: Fehler in SQL-Syntax
 
Moin...:P
[OT]
Du bist der richtige Kandidat für SQL States in Ressourcen. Da fallen ALLE "SQL.Add" bzw. "+" einfach weg. :wink:
http://www.delphipraxis.net/49505-sq...einbinden.html

[Achtung Schleichwerbung]
Mit meinem SQL Resource Creator kannst du auch das Statement direkt testen... :thumb:
Statt:
Zitat:

Solche SQL Skripte editiere ich gerne in einer separaten Textdatei mit Extension SQL.
...@Uwe: sorry. :wink:

http://www.delphipraxis.net/190316-d...e-creator.html
[/OT]
:wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr.
Seite 1 von 3  1 23      

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