Delphi-PRAXiS

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:

Uwe Raabe 19. Sep 2017 13:09

AW: Fehler in SQL-Syntax
 
Zitat:

Zitat von haentschman (Beitrag 1381599)
...@Uwe: sorry. :wink:

Kein Problem! Kann ja jeder selbst entscheiden, ob er seine SQL-Statements als String-Konstante oder String-Resource haben will.

nahpets 19. Sep 2017 13:12

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:
function TDMLSQLite.CreateTblHtml :String; // "ContentMasterData". ContentMasterData.
  var SQLString: TStringList;
begin
  SQLString := TStringList.Create;
  SQLString.LoadFromFile('TblHtml.sql');
  Result := SQLString.Text;
  SQLString.Free;
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.
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:
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;
Vorteil:
Funktionierende Scripte kann man nicht mehr versehentlich "verunstalten".
Scriptänderungen haben keine direkte Auswirkung auf das Kompilat des Programmes.

Delbor 19. Sep 2017 13:16

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

haentschman 19. Sep 2017 13:38

AW: Fehler in SQL-Syntax
 
Moin...:P
Einspruch euer Ehren... :warn:
Zitat:

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:
Das öffnet der SQL Injection Tor und alle Türen. :shock:
https://de.wikipedia.org/wiki/SQL-Injection

Die SQL sollten nie vom User änderbar sein. :roll:

PS:
Zitat:

ignorieren den von haentschman:
...sagt mein Arzt auch immer. "Alle ingnorieren mich! Der nächste bitte."

Zitat:

Hat den Vorteil, man muss bei Scriptänderungen nicht auch das Programm ändern.
Aber auch den Nachteil, unabhängig von der Injection, daß der User das Programm ins Code Nirvana schicken kann.

Uwe Raabe 19. Sep 2017 13:58

AW: Fehler in SQL-Syntax
 
Zitat:

Zitat von haentschman (Beitrag 1381603)
Das öffnet der SQL Injection Tor und alle Türen. :shock:

Ist zwar bei Resourcen nicht ganz so einfach, aber auch möglich: http://www.angusj.com/resourcehacker/

Delbor 19. Sep 2017 14:01

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:

Das öffnet der SQL Injection Tor und alle Türen.
Hmm..Ja! Und wenn man die Dinger in eine Art Cab-Datei packt?

OK, dann müssten die erstmal entpackt werden. Und der User könnte so eine Datei auch unbeabsichtigt ins Nirwana schicken..

Gruss
Delbor

hsg 19. Sep 2017 14:06

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.

nahpets 19. Sep 2017 14:52

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.

Delbor 19. Sep 2017 20:08

AW: Fehler in SQL-Syntax
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen
Neueste Fehlermeldung:
Zitat:

---------------------------
Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse ESQLiteNativeException mit der Meldung '[FireDAC][Phys][SQLite] ERROR: unknown database tbl_Html' aufgetreten.
---------------------------
Die bisher debattierte Funktion läuft nun durch (Und sollte die jetzt vemisste Tabelle erzeugen). Laut einem Journal wird sie das aber nicht. Das Journal lege ich mal bei.

Delphi-Quellcode:
    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
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
Delphi-Quellcode:
  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;
Wenn die Tabelle also nicht erzeugt wurde, hätte die Fehlermeldung angezeigt werden müsssen...

Gruss
Delbor

TigerLilly 19. Sep 2017 20:15

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.

Delbor 19. Sep 2017 20:34

AW: Fehler in SQL-Syntax
 
Hi TigerLilly

Zitat:

Im Attachten Log(?) ist die HTML-Tabelle NICHT zu finden.
Genau desshalb denke ich eigentlich, dass die Tabelle gar nicht erstellt wurde. Somit kann sie auch nicht gefunden werden. Mich irritiert aber, das die Connection nicht reklamiert...

Gruss
Delbor

TigerLilly 19. Sep 2017 20:48

AW: Fehler in SQL-Syntax
 
Wie gesagt, gib ALLE Exceptions aus, nicht nur EDatabaseError.

nahpets 19. Sep 2017 21:22

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;

Delbor 19. Sep 2017 22:04

AW: Fehler in SQL-Syntax
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen

Ich hab mal folgendes versucht:
Delphi-Quellcode:
  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;
Das Resultat ist im Anhang ersichtlich - zum Ziel führts leider nicht.
Ich werde mal die Sache mit dem Select testen.

TigerLilly 20. Sep 2017 06:53

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.

Delbor 20. Sep 2017 07:55

AW: Fehler in SQL-Syntax
 
Guten Morgen, TigerLilly

Das ist das Statement:
Delphi-Quellcode:
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;
Zu den auskommentierten Zeilen:
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

TigerLilly 20. Sep 2017 08:12

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:
https://sqlite.org/lang_createindex.html

Das, was in der Grafik als Schema-Name bezeichnet wird, ist NICHT der Datenbankname.
https://sqlite.org/lang_naming.html

Delbor 20. Sep 2017 10:55

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

TigerLilly 20. Sep 2017 10:56

AW: Fehler in SQL-Syntax
 
:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 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