AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Automatiach erstellte Syntax
Thema durchsuchen
Ansicht
Themen-Optionen

Automatiach erstellte Syntax

Ein Thema von Delbor · begonnen am 5. Sep 2017 · letzter Beitrag vom 9. Sep 2017
Antwort Antwort
Seite 1 von 2  1 2      
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 13:37
Hi zusammen

Der Abruch erfolgt gleich im erstem Statementt: (Hier das 2.)
Delphi-Quellcode:
function TDMLSQLite.Createkategorien_tabelle:String;
 var SQLString: String;
begin
  SQLString := 'CREATE TABLE "ContentMasterData"."kategorien_tabelle"('+
                            '"Kath_ID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK("Kath_ID">=0),'+
                            '"Kategorie" VARCHAR(120) NOT NULL);';
  Result := SQLString;
end;

function TDMLSQLite.Createbilddescribetabelle :String;
 var SQLString: String;
begin
  SQLString := 'CREATE TABLE ContentMasterData.bilddescribetabelle('+
                                '"BilddesribeID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK("BilddesribeID">=0),'+
                                '"bildtabelle_idBild" INTEGER NOT NULL CHECK("bildtabelle_idBild">=0),'+
                                '"bildkatID" INTEGER NOT NULL CHECK("bildkatID">=0),'+
                                '"bildname" VARCHAR(45),"Dateipfad" VARCHAR(250),"bildbeschreibung" VARCHAR(800),'+
                                '"bildlegende" VARCHAR(300),"Author" VARCHAR(250),'+
                                'CONSTRAINT "fk_bilddescribetabelle_bildtabelle1" '+
                                  'FOREIGN KEY("bildtabelle_idBild")'+
                                  'REFERENCES "bildtabelle"("idBild"));'+
  'CREATE INDEX "ContentMasterData"."bilddescribetabelle.fk_bilddescribetabelle_bildtabelle1_idx" ON"bilddescribetabelle" ("bildtabelle_idBild");';
  Result := SQLString;
end;
Wie man hier sieht, habe ich im unteren Statement in der 1. Zeile die doppelten Anführungszeichen entfernt. Allerdings erst vor einemm zweiten Durchlauf. Die Fehlermeldung lautete zwar gleich, aber der Datenbankname endete diesmal mit einem Hochkomma.
Zitat:
---------------------------
Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse ESQLiteNativeException mit der Meldung '[FireDAC][Phys][SQLite] ERROR: unknown database ContentMasterData' aufgetreten.
---------------------------
Dann hab ich noch einen draufgesetzt und die Datenbankbezeichnung weggelassen. Das Statement jetzt:
Delphi-Quellcode:
  SQLString := 'CREATE TABLE "bilddescribetabelle"('+
                                '"BilddesribeID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK("BilddesribeID">=0),'+
                                '"bildtabelle_idBild" INTEGER NOT NULL CHECK("bildtabelle_idBild">=0),'+
                                '"bildkatID" INTEGER NOT NULL CHECK("bildkatID">=0),'+
                                '"bildname" VARCHAR(45),"Dateipfad" VARCHAR(250),"bildbeschreibung" VARCHAR(800),'+
                                '"bildlegende" VARCHAR(300),"Author" VARCHAR(250),'+
                                'CONSTRAINT "fk_bilddescribetabelle_bildtabelle1" '+
                                  'FOREIGN KEY("bildtabelle_idBild")'+
                                  'REFERENCES "bildtabelle"("idBild"));'+
  'CREATE INDEX "ContentMasterData"."bilddescribetabelle.fk_bilddescribetabelle_bildtabelle1_idx" ON"bilddescribetabelle" ("bildtabelle_idBild");';
  Result := SQLString;
end;
Und die Fehlermeldung, als der Index erzeug werden sollte:
Zitat:
---------------------------
Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse ESQLiteNativeException mit der Meldung '[FireDAC][Phys][SQLite] ERROR: table "bilddescribetabelle" already exists' aufgetreten.
---------------------------
Im Anhang zeigt ein Jpeg die im SQLExpert geöffnete Datenbank....

Ja, ich denk, dann werd' ich mal...


Gruss
Delbor
Angehängte Grafiken
Dateityp: jpg Anzeige SQLiteExpert 2.JPG (26,6 KB, 9x aufgerufen)
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 14:15
Je nach Datenbank muss ein Name eindeutig sein, es darf also keine Tabelle mit dem Namen bilddescribetabelle und gleichzeitig einen Index mit dem Namen bilddescribetabelle geben.
Auch dürfen die Namen, je nach Datenbank, nur eine bestimmte Länge haben (häufig 30 Zeichen).

Funktioniert statt:
'CREATE INDEX "ContentMasterData"."bilddescribetabelle.fk_bilddescribetabelle_bildtabelle1_idx" ON "bilddescribetabelle" ("bildtabelle_idBild");';

eventuell dieses hier:
'CREATE INDEX "ContentMasterData"."fk_bilddescribetabelle_bildtabelle1_idx" ON "bilddescribetabelle" ("bildtabelle_idBild");';

Muss in den Tabellennamen immer auch noch tabelle drinstehen?
Wenn nein, lass das weg, dann werden die Namen deutlich kürzer oder wenn Du bei Fremdschlüsseln ein fk_ davorstellst und beim Index ein _idx hinten anhängst, dann lass Tabellennamen mit t_ beginnen, Views können dann mal mit v_ beginnen ...

Sind die Unmengen von " bei SQLite tatsächlich bei der Angabe der Bezeichner erforderlich? Je nach Datenbank benötigt man das, wenn man die Bezeichner zwingend casesensitiv haben will, ohne die " wäre Groß-/Kleinschreibung dann egal. Aber das scheint nicht einheitlich zu sein.

Bei den Änderungen ist mir durchaus klar, dass sie dann nicht zur die Scripte betreffen, sondern sich auch durch die von Dir schon erstellte Applikation ziehen. Der Änderungsaufwand könnten dann auch einen unüberschaubaren Rattenschwanz nach sich ziehen. Da wären dann erstmal Aufwand und Nutzen abzuwägen.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 14:19
Hi nahpeds

Zitat:
"...("CSS-Tabelle_idCSS");''CREATE TABLE "ContentMasterData..."
Das dient eigentlich nur der Demonstration dessen, was im SQLString stehen muss, wenn ich ihn mit den Ergebnissen der einzelnen Funktionen zusammensetze.
Zitat:
Bei Deinem 2. ExecSQL führst Du irgendwas aus, was aus mehreren Strings zusammengesetzt ist.
Ja eben - und dies auch noch ohne Leerzeichen dazwischen.
Zitat:
Normalerweise kann ExecSQL (wie oben schon angemerkt) nur ein Statement, also z. B. das Create von einer Tabelle, ein einzelnes Insert, ein einzelnes Update ..., aber keine Abfolge von mehr oder weniger Statments: Sprich: (höchstwahrscheinlich) keine Scripte.
Selbst wenn ExecSQL mehr als ein Statement ausführen könnte - wie soll er die unterscheiden, wenn weder ein Leerzeichen oder sonst ein bestimmtes Steuerzeichen zwischen den einzelnen Statements steht? Der anfangs zitierte String ist das Ende des einen und der Beginn eines andern Statements.
Zitat:
Meine Regel ist: Ein Statement ein ExecSQL (auch dann, wenn ich es anders lösen könnte). Dadurch weiß ich im Fehlerfalle immer, welches Statement den Fehler auslöste und muss nicht ggfls. tausende von Zeilen durchsuchen, um irgendwo einen Fehler zu finden.
Und die ist mit Sicherheit goldrichtig. Denn wie gesagt: In meinem letzten Post habe ich die Prozeduren eingesetzt, die du gestern gepostet hast.
So, wies nun ausieht, muss, bzw. darf ich die Datenbank in den einzelnen Statements gar nicht mehr anführen. Und was das mit den diversen Hochkommas auf sich hat, wird sich zeigen. Die Dinger sind möglicherweise bei Namen, die Leerzeichen enthalten (ich glaub, das steht auch irgendwo hier) zwingen, bei Namen andreseits aber nicht störend.
'CREATE TABLE "bilddescribetabelle"('+ Das wurde anstandslos ausgeführt.


Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor ( 8. Sep 2017 um 16:52 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 14:43
SQL-Statments enden (für gewöhnlich) mit einem Semikolon, das ist der Trenner. Ein Leerzeichen zwischen mehreren Statements ist (technisch) nicht erforderlich. Zur besseren Lesbarkeit gilt bei mir: Ein Statemnt, eine Zeile. Muss ein Statement auf mehrere Zeilen verteilt werden, dann kommt auch noch eine Leerzeile dazwischen.

Technisch kann man alles weglassen, was zur besseren Lesbarkeit führt, kann also z. B. ein Script von 10 MB durchaus als Einzeiler schreiben. Kann man, muss man aber nicht.

Auch wenn es mehr Aufwand ist, mache ich sowas
Delphi-Quellcode:
function TDMLSQLite.Createbilddescribetabelle :String;
 var SQLString: String;
begin
  SQLString := 'CREATE TABLE ContentMasterData.bilddescribetabelle('+
                                '"BilddesribeID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK("BilddesribeID">=0),'+
                                '"bildtabelle_idBild" INTEGER NOT NULL CHECK("bildtabelle_idBild">=0),'+
                                '"bildkatID" INTEGER NOT NULL CHECK("bildkatID">=0),'+
                                '"bildname" VARCHAR(45),"Dateipfad" VARCHAR(250),"bildbeschreibung" VARCHAR(800),'+
                                '"bildlegende" VARCHAR(300),"Author" VARCHAR(250),'+
                                'CONSTRAINT "fk_bilddescribetabelle_bildtabelle1" '+
                                  'FOREIGN KEY("bildtabelle_idBild")'+
                                  'REFERENCES "bildtabelle"("idBild"));'+
  'CREATE INDEX "ContentMasterData"."bilddescribetabelle.fk_bilddescribetabelle_bildtabelle1_idx" ON"bilddescribetabelle" ("bildtabelle_idBild");';
  Result := SQLString;
end;
lieber eher so:
Delphi-Quellcode:
function TDMLSQLite.Createbilddescribetabelle :String;
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Add('CREATE TABLE ContentMasterData.bilddescribetabelle');
  sl.Add('(');
  sl.Add(' "BilddesribeID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ');
  sl.Add(' CHECK("BilddesribeID" >= 0),');
  sl.Add(' "bildtabelle_idBild" INTEGER NOT NULL CHECK("bildtabelle_idBild" >= 0),');
  sl.Add(' "bildkatID" INTEGER NOT NULL CHECK("bildkatID" >= 0),');
  sl.Add(' "bildname" VARCHAR(45),');
  sl.Add(' "Dateipfad" VARCHAR(250),');
  sl.Add(' "bildbeschreibung" VARCHAR(800),');
  sl.Add(' "bildlegende" VARCHAR(300),');
  sl.Add(' "Author" VARCHAR(250),');
  sl.Add(' CONSTRAINT "fk_bilddescribetabelle_bildtabelle1" ');
  sl.Add(' FOREIGN KEY("bildtabelle_idBild")');
  sl.Add(' REFERENCES "bildtabelle"("idBild")');
  sl.Add(');');
  sl.Add('CREATE INDEX "ContentMasterData"."bilddescribetabelle.fk_bilddescribetabelle_bildtabelle1_idx"');
  sl.Add(' ON "bilddescribetabelle" ("bildtabelle_idBild");');
  Result := sl.Text;
  sl.Free;
end;
Und das geht nur, wenn man mehrere Statements bei SQLite mit ExecSQL ausführen kann, sonst musst Du dadraus mehrere Funktionen machen, eine für's Create Table und eine für Create Index.

Also eher sowas:
Delphi-Quellcode:
function TDMLSQLite.Create_BilddescribeTabelle :String;
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Add('CREATE TABLE ContentMasterData.bilddescribetabelle');
  sl.Add('(');
  sl.Add(' "BilddesribeID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ');
  sl.Add(' CHECK("BilddesribeID" >= 0),');
  sl.Add(' "bildtabelle_idBild" INTEGER NOT NULL CHECK("bildtabelle_idBild" >= 0),');
  sl.Add(' "bildkatID" INTEGER NOT NULL CHECK("bildkatID" >= 0),');
  sl.Add(' "bildname" VARCHAR(45),');
  sl.Add(' "Dateipfad" VARCHAR(250),');
  sl.Add(' "bildbeschreibung" VARCHAR(800),');
  sl.Add(' "bildlegende" VARCHAR(300),');
  sl.Add(' "Author" VARCHAR(250),');
  sl.Add(' CONSTRAINT "fk_bilddescribetabelle_bildtabelle1" ');
  sl.Add(' FOREIGN KEY("bildtabelle_idBild")');
  sl.Add(' REFERENCES "bildtabelle"("idBild")');
  sl.Add(');');
  Result := sl.Text;
  sl.Free;
end;

function TDMLSQLite.Create_fk_bilddescribetabelle_bildtabelle1_idx :String;
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Add('CREATE INDEX "ContentMasterData"."bilddescribetabelle.fk_bilddescribetabelle_bildtabelle1_idx"');
  sl.Add(' ON "bilddescribetabelle" ("bildtabelle_idBild");');
  Result := sl.Text;
  sl.Free;
end;
Bitte prüfe als Erstes: Kann man bei SQLite mehrere SQL in einem ExecSQL ausführen?

Wenn nein, dann baue zuerst entsprechende Funktionen, je Statement eine.

Also pro SQL darf es nur ein ; geben.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 15:04
Hi nahpeds
Zitat:
Muss in den Tabellennamen immer auch noch tabelle drinstehen?
Wenn nein, lass das weg, dann werden die Namen deutlich kürzer oder wenn Du bei Fremdschlüsseln ein fk_ davorstellst und beim Index ein _idx hinten anhängst, dann lass Tabellennamen mit t_ beginnen, Views können dann mal mit v_ beginnen ...
Wenn ich das ändere, dann muss ich das zuallererst im DB-Modell in Workbench tun und dann konsequent durch alles hindurch durchziehen. Wenn ich das mit der Zeit vergleiche, die ich bis jetzt damit verbracht habe, meine MySQL-DB in SQLite zu erstellen, so würde das ändern aller Namen wohl ein vielfaches der bisher eingesetzten Zeit beanspruchen. Dasschlimmste sind die Namen der Zwischentabellen - die hätten wohl glat Einträge im Guinnesbuch der Rekorde für die längsten Namen verdient.

Zitat:
Sind die Unmengen von " bei SQLite tatsächlich bei der Angabe der Bezeichner erforderlich? Je nach Datenbank benötigt man das, wenn man die Bezeichner zwingend casesensitiv haben will, ohne die " wäre Groß-/Kleinschreibung dann egal. Aber das scheint nicht einheitlich zu sein.
Ich weiss es bislang auch nicht wirklich. Embarcadero benutzt in mindestens eiem Tut sogar 2 einzelne Hochkommas...

Zitat:
Bei den Änderungen ist mir durchaus klar, dass sie dann nicht zur die Scripte betreffen, sondern sich auch durch die von Dir schon erstellte Applikation ziehen. Der Änderungsaufwand könnten dann auch einen unüberschaubaren Rattenschwanz nach sich ziehen. Da wären dann erstmal Aufwand und Nutzen abzuwägen.
Sagen wir's mal so: seit ich mir schon vor längere Zeit eine neue Kiste und die jetzige Delphi-Version angeschafft habe, bin ich eigentlich nur noch mit dem DB-Zeugs beschäftigt. Etwas vom wohl wichtigsten war die Umstellung von DBExpress nach Firedac. Und dann kam die Idee der von mir so genannten "SatellitenDatenbanken" auf, die in Zukunft die Rohbilder und die Bitmaps aufnemen sollen. Die Dinger sind mir einfach zu gross, um sie wirklich in der Hauptdatenbank zu speichern.
Und so kommt irgendwann mal der Punkt, wo ich sagen muss: Jetzt lass ich das mal so und arbeite am eigentlichen Programm weiter.
Ich hab auch grad gesehen: die Doppelten Hochkommas wurdenso von Workbench exportiert. Das scheint mal so,als ob sich da nicht viel machen lässt...

Gruss
Delbor

PS: Mal etwas mehr oftopic:
In den MySQL Workbench-Einstellungen sind die FK-Namensregelung so definiert: fk_%stable%_%dtable%,
für Spaltennamen so: %table%_%column%. Da seh ich eigentlich keinen grossen Spielraum, wenn man sprechende Namen verwenden will...
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor ( 8. Sep 2017 um 15:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 15:56
Ich denke, ich muß bisher gesagtes wiederholen:
für ExecSQL/SQLExec nur EIN Statement !
Zumindest in der Entwicklungsphase, wenn man mit dem DBMS nicht so vertraut ist.
Das ist somit ein NoGo:
Zitat:
SQLString := 'CREATE TABLE ContentMasterData.bilddescribetabelle('+
.......
'REFERENCES "bildtabelle"("idBild"));'+
'CREATE INDEX ".....
Delphi-Quellcode:
procedure TDMLSQLite.ContentmasterDBCreate;
   var SQLString: String;
begin
   try
     DMLSQLite.FDSQLiteConnection.Connected := false;
     FDSQLiteConnection.ExecSQL('ATTACH "M:\SQLite-DB Corner\ContentMasterData\ContentMasterData.sqlite" AS ContentMasterData');
// DMLSQLite.FDSQLiteConnection.Params.Values['Database']:='"M:\SQLite-DB Corner\ContentMasterData\ContentMasterData.sqlite"';

// War obige Zeile nicht auskommentiert: Unbekannte Datenbank. Danach liefen alle Createanweisungen durch. Beim nächsten ExecCSQL krachte es

     DMLSQLite.FDSQLiteConnection.Params.Values['FailIfMissing']:='False';
     DMLSQLite.FDSQLiteConnection.Params.Values['PRAGMA foreign_keys']:='ON';
     SQLiteTestMain.LBxPathlist.Items.AddStrings(FDSQLiteConnection.Params);
     DMLSQLite.FDSQLiteConnection.Connected := true;
     DMLSQLite.FDSQLiteConnection.GetInfoReport(SQLiteTestMain.Memo1.Lines);
     SQLString := '';
     SQLString := Createbilddescribetabelle;
Falls mit TDMLSQLite und DMLSQLite das selbe gemeint sein sollte, solltest Du self. nutzen. Dann gibt es auch kein Vertun, was denn womit gemeint ist. (Das gilt für den Compiler wie für den Programmierer).

Aus dem Anhang in #35 geht hervor, das irgendwo auf dem Laufwerk M: eine Datei existiert, die wohl ein Datenbank enthält. Diese Datenbank ContentMasterData enthält die Tabelle bilddescribetbelle.

Versuch doch mal in einem Testprogramm einen Connect durchzuführen und dann mit
select * from bilddescribetabelle bzw.
select * from ContentMasterData.bilddescribetabelle auf diese Tabelle zuzugreifen.

Übrigens ein .connected:=false; direkt gefolgt von einem .ExecSQL erschein nicht sehr sinnvoll.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 16:43
PS: Mal etwas mehr oftopic:
In den MySQL Workbench-Einstellungen sind die FK-Namensregelung so definiert: fk_%stable%_%dtable%,
für Spaltennamen so: %table%_%column%. Da seh ich eigentlich keinen grossen Spielraum, wenn man sprechende Namen verwenden will...
Ja und? Kann man doch nach eigenen Kriterien ändern.

Und was die Workbench für MySQL macht, muss für SQLite nicht als Gesetz gelten.

Da Du alle Statements letztlich in den Delphiquelltext übernimmst, kannst Du sie dort nach Deinen Wünschen sinnvoll und lesbar anpassen.

Wenn SQLite die Unmenge von " nicht braucht, dann weg damit.

Habe selten derart schlecht lesbare Scripte gesehen, liegt vielleicht daran, dass ich als "alter Sack" Datenbankscripte noch selbst schreiben musste und mich (als misstrauischer Knilch) nie auf automatisch erstelltes Zeug blind verlassen habe.

Für mich ist wichtig, dass sowohl lesbarer, als auch korrekt funktionierender Quelltext entsteht. Egal welche Quellen und / oder Werkzeuge die Grundlage lieferten.

Was mir erst jetzt auffiel:
Delphi-Quellcode:
procedure TDMLSQLite.ContentmasterDBCreate;
  var SQLString: String;
begin
  try
    DMLSQLite.FDSQLiteConnection.Connected := false;
    FDSQLiteConnection.ExecSQL('ATTACH "M:\SQLite-DB Corner\ContentMasterData\ContentMasterData.sqlite" AS ContentMasterData');
// DMLSQLite.FDSQLiteConnection.Params.Values['Database']:='"M:\SQLite-DB Corner\ContentMasterData\ContentMasterData.sqlite"';

// War obige Zeile nicht auskommentiert: Unbekannte Datenbank. Danach liefen alle Createanweisungen durch. Beim nächsten ExecCSQL krachte es

    DMLSQLite.FDSQLiteConnection.Params.Values['FailIfMissing']:='False';
    DMLSQLite.FDSQLiteConnection.Params.Values['PRAGMA foreign_keys']:='ON';
    SQLiteTestMain.LBxPathlist.Items.AddStrings(FDSQLiteConnection.Params);
    DMLSQLite.FDSQLiteConnection.Connected := true;
    DMLSQLite.FDSQLiteConnection.GetInfoReport(SQLiteTestMain.Memo1.Lines);
Da passt was nicht: Zuerst die Datenbankverbindung beenden, dann ein ExecSQL ausführen? Wo denn, ohne Datenbankverbindung?
FDSQLiteConnection.ExecSQL('ATTACH "M:\SQLite-DB Corner\ContentMasterData\ContentMasterData.sqlite" AS ContentMasterData'); gehört hinter FDSQLiteConnection.Connected := true; aber vor die Createstatements.
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#8

AW: Automatiach erstellte Syntax

  Alt 9. Sep 2017, 11:26
Du verwendest doch FireDac?
http://docwiki.embarcadero.com/CodeE....SQLite_Sample

Dann sollte dein Code doch ganz anders aussehen:

FDSQLiteConnection.Connected:=false;
// params nimmt die NUR verbindungsparameter auf
FDSQLiteConnection.Params.Add('DriverID=SQLite');
FDSQLiteConnection.Params.Add('Database=C.\....');
FDSQLiteConnection.Connected:=true;
// jetzt ist die DB geöffnet. gab es sie nicht, wurde sie jetzt neu angelegt

// alle Anweisungen für SQLite müssen mit ExecSQL ausgeführt werden
FDSQLiteConnection.SQLExec('PRAGMA foreign keys=on');
FDSQLiteConnection.SQLExec('create table ....');

Tipp: Mach dir ein kleines Testprogramm und scha, ob du das connecten und anlegen einer Tabelle hinbekommst, bevor du weiter machst.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Automatiach erstellte Syntax

  Alt 9. Sep 2017, 12:14
Hi TigerLilly

Vielen Dank für den Tip!
Zitat:
Tipp: Mach dir ein kleines Testprogramm und scha, ob du das connecten und anlegen einer Tabelle hinbekommst, bevor du weiter machst.
Zurzeit arbeite ich an einem Testprogramm - nur dass ich da auch schon andere Dinge ausgetestet habe, wie zum Bleistift das Erstellen einer Hilfe.

Zitat:
// alle Anweisungen für SQLite müssen mit ExecSQL ausgeführt werden
FDSQLiteConnection.SQLExec('PRAGMA foreign keys=on');
FDSQLiteConnection.SQLExec('create table ....');
Ich habe zur Zeit folgendes Konstrukt:
Delphi-Quellcode:
  try
    FDSQLiteConnection.Connected := true;
    FDSQLiteConnection.ExecSQL('ATTACH "M:\SQLite-DB Corner\ContentMasterData\ContentMasterData.sqlite" AS ContentMasterData');
    FDSQLiteConnection.Connected := false;
    FDSQLiteConnection.Params.Values['Database'] := 'M:\SQLite-DB Corner\ContentmasterData\ContentmasterData.sqlite'; //
    FDSQLiteConnection.Params.Values['FailIfMissing'] := 'False';
    FDSQLiteConnection.Params.Values['PRAGMA foreign_keys'] := 'ON';
    FDSQLiteConnection.Connected := true;

    Result := FDSQLiteConnection.Connected;
  except
Das wiederholte Öffnen und Schliessen der Verbindung gefällt mir dabei gar nicht, und so habe ich die Zeile mit der ATTACH-Anweisung nach unten verlegt (in die jetzige Leerzeile), was zu einem Fehler führte. Welcher das war, kann ich zur Zeit nicht mehr nachvollziehen, da das schon einige Stunden her ist.


Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor ( 9. Sep 2017 um 12:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#10

AW: Automatiach erstellte Syntax

  Alt 9. Sep 2017, 12:28
Testprogramme müssen so klein sein + so wenig Aufwand bedeuten, dass man sie leichten Herzens löscht/verändert etc. Sonst klebt man immer am gleichen Code + lernt nichts dazu. Immer nur eine Sache auf einmal ausprobieren.
  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 10:45 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-2025 by Thomas Breitkreuz