![]() |
Datenbank: SQLite • Version: 3 • Zugriff über: FireDac
Fehler in SQL-Syntax
Hi zusammen
Die Fehlermeldung: Zitat:
Delphi-Quellcode:
Das ist die Fortsetzung aus diesem
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; ![]()
Delphi-Quellcode:
"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.
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; Im folgenden noch die Funktion, wie sie von MySQL-Workbench exportiert wurde:
Delphi-Quellcode:
Was habe ich übersehen?
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") ); Gruss Delbor |
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.
|
AW: Fehler in SQL-Syntax
Zitat:
'CONSTRAINT fk_tbl_Html_tbl_Javascript1FOREIGN KEY(tbl_Javascript_idJavascript)' |
AW: Fehler in SQL-Syntax
Zitat:
Aber meine Aussage stimmt ja trotzdem. Das Statement aus solches funktioniert und ist korrekt. :-D |
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 |
AW: Fehler in SQL-Syntax
Darum am besten am Ende oder Anfang jeder Zeile ein Leerzeichen einfügen.
|
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:
Und schlechter zu lesen ist es auch nicht.
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; |
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:
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.
'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),'+ Zu Nahpeds Vorschlag mit der Stringliste: Mal sehen, ob ich mir das angewöhnen kann... Nachtrag: Zitat:
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 |
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.
|
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: ![]() [Achtung Schleichwerbung] Mit meinem SQL Resource Creator kannst du auch das Statement direkt testen... :thumb: Statt: Zitat:
![]() [/OT] :wink: |
AW: Fehler in SQL-Syntax
Zitat:
|
AW: Fehler in SQL-Syntax
Gehen wir mit Uwes Vorschlag noch etwas weiter und ignorieren den von haentschman:
Die Scripte werden als Dateien gespeichert und zur Laufzeit geladen. Hat den Vorteil, man muss bei Scriptänderungen nicht auch das Programm ändern. Man lädt einfach nur die Scripte und gut ist:
Delphi-Quellcode:
Wenn man's noch weiter vereinfacht, dann übergibt man den Namen des Scriptes als Parameter und muss nicht mehr für jede Tabelle ... eine eigene Funktion erstellen.
function TDMLSQLite.CreateTblHtml :String; // "ContentMasterData". ContentMasterData.
var SQLString: TStringList; begin SQLString := TStringList.Create; SQLString.LoadFromFile('TblHtml.sql'); Result := SQLString.Text; SQLString.Free;
SQL-Code:
-- Erstellscript für die Tabelle tbl_html
-- Scriptedate: tbl_html.sql 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) );
Delphi-Quellcode:
Vorteil:
function TDMLSQLite.CreateTbl(AScriptName : String) :String;
var SQLString: TStringList; begin if FileExists(AScriptName) then begin SQLString := TStringList.Create; SQLString.LoadFromFile(AScriptName); Result := SQLString.Text; SQLString.Free; end else begin MessageDlg(Format('Script nicht gefunden: %s',[AScriptName]),mtError,[mbOK],0); end; end; Funktionierende Scripte kann man nicht mehr versehentlich "verunstalten". Scriptänderungen haben keine direkte Auswirkung auf das Kompilat des Programmes. |
AW: Fehler in SQL-Syntax
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Uwe Raabe
Ich hatte die Datei (*.sql) mit Notepad++ geladen. Der hat auch Syntaxhighliting, auch für diverse Dateiendungen. Ausgereizt habe ich dessen Möglichkeiten allerdings noch nicht wirklich. Aber auch so ist er nützlich, kann er doch das eine oder andere, das Texteditoren normalerweise nicht können. Gruss Delbor PS: Die neunen Beiträge habe ich soeben gesehen, möchte aber gesondert darauf eingehen |
AW: Fehler in SQL-Syntax
Moin...:P
Einspruch euer Ehren... :warn: Zitat:
![]() Die SQL sollten nie vom User änderbar sein. :roll: PS: Zitat:
Zitat:
|
AW: Fehler in SQL-Syntax
Zitat:
![]() |
AW: Fehler in SQL-Syntax
Hi zusammen
Approppo Scripte und Dateien: Ich hab in den letzten Tagen ziemlich auf Embarcaderos Seiten geblättert und dabei TFDScripts, bzw. TFDScript entdeckt. Auch da können Statments aus Dateien geladen werden. Allerdings habe ich damit noch ein Problem: Meine Insert-Funktionen laufen in einer bestimmten Reihenfolge ab, und jede ermittelt am Ende den zuletzt eingefügten PK (last_insert_id bei MySQL) und gibt den für den FK an die nächste Funktion weiter. Unter Verwendung von TFDScripts ruft ja das Root-Element die diversen Statements auf. Bisher habe ich noch keine Möglichkeit gefunden, dass das eine aufgerufene Script einen Integer (Last-RowID bzw. LastInsertID) an TFDScripts zurückgeben kann. Was habe ich übersehen oder überlesen? Zitat:
OK, dann müssten die erstmal entpackt werden. Und der User könnte so eine Datei auch unbeabsichtigt ins Nirwana schicken.. Gruss Delbor |
AW: Fehler in SQL-Syntax
Alternative zur Speicherung in Dateien: Speicherung in einer Datenbank-Tabelle :-D
So mache ich es inzwischen bei einer Applikation. Dabei sind die Statements noch zusätzlich aufgeteilt in "Select", "Join", "Where" und "Order"-Abschnitt. Bei Bedarf kann so das verwendete Statement noch entsprechend vom Programm (z.B. durch Angabe von zusätzlichen Where-Bedingungen, Joins oder Sortierreihenfolgen) angepasst werden. Zwei kleine Funktionen liefern mir dann das passende Skript an die benötigte Stelle. Normale Benutzer kommen so an die Statements nicht heran, reduziert also deutlich die Gefahr der Injection. |
AW: Fehler in SQL-Syntax
Ob Datei, Resource, Datenbank oder direkt im Programmcode:
Kommt auf die Aufgabe an. Software für Normalverbraucher und spielwütige: Alles im Programmcode. Resource, wenn man in bedingtem Umfang datenbankunabhängig sein will. Es wird die entsprechende Resource eingebunden. SQL ist ja leider nicht gleich SQL, die Unterschiede bei den Dialekten können schon recht gravierend sein. Datenbank: Das hat was, mache ich auch meist so. Anpassungen sind jederzeit möglich. Aber es wird ein entsprechendes Berechtigungssystem benötigt, damit nicht jeder da "rumwuseln" kann, sondern nur die, die dazu autorisiert sind. Im professionellen Umfeld also eher ein Datenbankadmin. Datei ist eigentlich ähnlich zur Datenbank zu sehen: Nicht jeder darf, sondern nur autorisierte. Ansonsten sind die Scripte so abgelegt, dass sie nicht allgemein zugänglich sind. Das dürfte in jeder vernünftigen, professionellen Umgebung gegeben sein. ZIP ...: Die kann man passwortgeschützt erstellen, da kann dann auch so schnell keiner mal eben was dran ändern. Auch darüber kann man dann Scripte datenbankunabhängig zur Verfügung stellen. Je Datenbanktyp eine ZIP mit den passenden Scripten. Ausgeliefert wird die, die zur Datenbank des Kunden passt. Keine der Möglichkeiten ist grundsätzlich besser als die anderen und keine ist grundsätzlich abzulehnen. Es kommt halt auf die konkret zu erstellende Software und die Umgebung, in der sie zum Einsatz kommen wird, an. |
AW: Fehler in SQL-Syntax
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen
Neueste Fehlermeldung: Zitat:
Delphi-Quellcode:
Das ist die Reihenfolge der Aufrufe. Der Code läüft also durch und die Tabelle wird (scheinbar?) erzeugt. Anbei die Funktion Execute, die das SQL-Statement ausführt
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 if ExecuteSQL(CreateIndexTbl_Html_Tbl_CSS1) then
Delphi-Quellcode:
Wenn die Tabelle also nicht erzeugt wurde, hätte die Fehlermeldung angezeigt werden müsssen...
function TDMLSQLite.ExecuteSQL(ASQL : String) : Boolean;
begin try FDSQLiteConnection.ExecSQL(ASQL); Result := True; except on E: EDatabaseError do begin ShowMessage('Fehler beim Ausführen des Statements:' + #13#13 + ASQL + #13#13 + E.Message); Result := False; end; end; end; Gruss Delbor |
AW: Fehler in SQL-Syntax
Die Exception würde nur aufgezeigt, wenn sie vom Typ EDatabaseError ist.
Im Attachten Log(?) ist die HTML-Tabelle NICHT zu finden. Logge doch ALLE Exceptions. |
AW: Fehler in SQL-Syntax
Hi TigerLilly
Zitat:
Gruss Delbor |
AW: Fehler in SQL-Syntax
Wie gesagt, gib ALLE Exceptions aus, nicht nur EDatabaseError.
|
AW: Fehler in SQL-Syntax
Der Rückgabewert der Funktion ist nur False, wenn ein Datenbankfehler geworfen wird. In anderen Fällen ist Result entweder True oder undefiniert.
(Eigentlich müsste es eine entsprechende Compilermeldung geben - Rückgabewert könnte undefiniert sein. o. ä .) Wenn FDSQLiteConnection.ExecSQL(ASQL) ausgeführt wird und keine Exception fliegt, ist der Rückgabewert der Funktion true, unabhängig davon, ob das erwartete erledigt wurde oder nicht.
Delphi-Quellcode:
function TDMLSQLite.ExecuteSQL(ASQL : String) : Boolean;
begin Result := False; try FDSQLiteConnection.ExecSQL(ASQL); // Hier sollte man noch prüfen, ob das, was in ASQL gemacht werden // soll, auch wirklich gemacht wurde. // Bei Insert, Update und Delete findet man die Anzahl der // Änderungen in RowsAffected. // Bei 'ner Tabelle, die erstellt werden sollte, könnte man noch ein // select * from tabelle // hier ausführen und nur, wenn das erfolgreich ist folgt: Result := True; except on E: EDatabaseError do begin ShowMessage('Fehler beim Ausführen des Statements:' + #13#13 + ASQL + #13#13 + E.Message); end; end; end; |
AW: Fehler in SQL-Syntax
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen
Ich hab mal folgendes versucht:
Delphi-Quellcode:
Das Resultat ist im Anhang ersichtlich - zum Ziel führts leider nicht.
function TDMLSQLite.ExecuteSQL(ASQL : String) : Boolean;
var ReportList: TStringlist; begin ReportList := TStringlist.Create; try try FDSQLiteConnection.ExecSQL(ASQL); FDSQLiteConnection.GetInfoReport(ReportList); if FileExists('M:\SQLite-DB Corner\ContentmasterData\GetInfoReport') then SQLiteTestMain.Memo1.Lines.LoadFromFile('M:\SQLite-DB Corner\ContentmasterData\GetInfoReport'); SQLiteTestMain.Memo1.Lines.Add('********************'); SQLiteTestMain.Memo1.Lines.AddStrings(ReportList); SQLiteTestMain.Memo1.Lines.SaveToFile('M:\SQLite-DB Corner\ContentmasterData\GetInfoReport'); Result := True; except on E: EDatabaseError do begin ShowMessage('Fehler beim Ausführen des Statements:' + #13#13 + ASQL + #13#13 + E.Message); Result := False; end; end; finally Reportlist.Free; end; end; Ich werde mal die Sache mit dem Select testen. |
AW: Fehler in SQL-Syntax
Die genaue Fehlermeldung lautet: Unknown DATABASE(!) tbl_Html.
Das heisst, die Tabelle wird angelegt, sonst hättest du eine Fehlermeldung bekommen, aber dort, wo du auf die Tabelle zugreifst ist das Problem. Dort wird der Tabellenname als Datenbankname verstanden. Zeig mal das SQL-Statement, in dem du das erste mal auf die Tabelle zugreifen möchtest. |
AW: Fehler in SQL-Syntax
Guten Morgen, TigerLilly
Das ist das Statement:
Delphi-Quellcode:
Zu den auskommentierten Zeilen:
function TDMLSQLite.CreateIndexTbl_Html_Tbl_CSS1 :String; // Index tbl_Html-tbl_CSS1 ContentMasterData.
var SQLString: String; begin SQLString := 'CREATE INDEX tbl_Html.fk_tbl_Html_tbl_CSS1_idx'+ ' ON tbl_Html (tbl_CSS_idCSS)'; Result := SQLString; end; Der erste Ausdruck diente mir dazu, den Überblick beim Aufteilen des Scripts in einzelne Funktionen zu behalten Der zweite Ausdruck: anfänglich hatte ich die DB explizit adressiert, was aber SQLite offenbar nicht akzeptiert. Heute morgen fiel mir ein: Als ich in den letzten Tagen in der Embarcadero-Help u.a. durch die Themen zu TFDScripts blätterte, fiel mir auf, dass nach dem Aufruf von TFDScripts.executeall immer auch TFDScripts.validateall aufgerufen wurde. Dementsprechend bin ich jetzt dabei, in dieser Richtung zu recherchieren. Gruss Delbor |
AW: Fehler in SQL-Syntax
Das sollte besser so lauten:
CREATE INDEX fk_tbl_Html_tbl_CSS1_idx ON tbl_Html (tbl_CSS_idCSS) Siehe hier: ![]() Das, was in der Grafik als Schema-Name bezeichnet wird, ist NICHT der Datenbankname. ![]() |
AW: Fehler in SQL-Syntax
Hi TigerLilly
Vielen Dank! Nachdem ich dies korrigiert hatte, wurde zwar noch einiges angemeckert, immer so im Stil "in der Nähe von". Nebst zuwenigen waren dies auch zuviele Leerzeichen etc. Gruss Delbor |
AW: Fehler in SQL-Syntax
:thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 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