Delphi-PRAXiS
Seite 5 von 5   « Erste     345   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Automatiach erstellte Syntax (https://www.delphipraxis.net/193754-automatiach-erstellte-syntax.html)

p80286 8. Sep 2017 15:56

AW: Automatiach erstellte Syntax
 
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
Delphi-Quellcode:
select * from bilddescribetabelle
bzw.
Delphi-Quellcode:
select * from ContentMasterData.bilddescribetabelle
auf diese Tabelle zuzugreifen.

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

Gruß
K-H

nahpets 8. Sep 2017 16:43

AW: Automatiach erstellte Syntax
 
Zitat:

Zitat von Delbor (Beitrag 1380645)
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?
Delphi-Quellcode:
FDSQLiteConnection.ExecSQL('ATTACH "M:\SQLite-DB Corner\ContentMasterData\ContentMasterData.sqlite" AS ContentMasterData');
gehört hinter
Delphi-Quellcode:
FDSQLiteConnection.Connected := true;
aber vor die Createstatements.

TigerLilly 9. Sep 2017 11:26

AW: Automatiach erstellte Syntax
 
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.

Delbor 9. Sep 2017 12:14

AW: Automatiach erstellte Syntax
 
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

TigerLilly 9. Sep 2017 12:28

AW: Automatiach erstellte Syntax
 
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.

nahpets 9. Sep 2017 13:45

AW: Automatiach erstellte Syntax
 
Das kann so nicht funktionieren:
Delphi-Quellcode:
 try
    //Datenbankverbindung herstellen, mit welchen Optionen?
    FDSQLiteConnection.Connected := true;
    // Datenbank sagen, dass sie eine weitere Datenbankdatei nutzen soll.
    FDSQLiteConnection.ExecSQL('ATTACH "M:\SQLite-DB Corner\ContentMasterData\ContentMasterData.sqlite" AS ContentMasterData');
    // Datenbankverbindung beenden. Damit ist die Info für die Nutzung einer weiteren Datebank "vergessen".
    FDSQLiteConnection.Connected := false;
    // Jetzt sagen wir erst der Datenbankverbindung, "wohin" wir möchten.
    FDSQLiteConnection.Params.Values['Database'] := 'M:\SQLite-DB Corner\ContentmasterData\ContentmasterData.sqlite'; //
    FDSQLiteConnection.Params.Values['FailIfMissing'] := 'False';
    // Das dürfte kein Parameter sein, sondern ein mit ExecSQL auszuführender Befehl,
    // da ja (laut Eingangspost) ein Teil des Scriptes und keine Verbindungsinformation.
    // Das Pragma dient nicht zur Herstellung der Datenbankverbindung, sondern ist eine
    // Verhaltensanweisung für den Umgang mit Fremdschlüsseln innerhalb der Datenbankverbindung.
    FDSQLiteConnection.Params.Values['PRAGMA foreign_keys'] := 'ON';
    // Datenbankverbindung herstellen.
    FDSQLiteConnection.Connected := true;
    Result := FDSQLiteConnection.Connected;
    // Da ja ATTACH in einer vorherigen Datenbankverbindung aufgerufen wurde und nach deren Beendigung
    // nicht mehr bekannt ist, dürfte es im weiteren Ablauf nicht verwunderlich sein, wenn die
    // dort verbundene Datenbank nicht mehr bekannt ist.
    // Hier müssten dann wohl eher die beiden folgen:
    FDSQLiteConnection.ExecSQL('ATTACH "M:\SQLite-DB Corner\ContentMasterData\ContentMasterData.sqlite" AS ContentMasterData;');
    FDSQLiteConnection.ExecSQL('PRAGMA foreign_keys = ON;');
  except
Alles was Du im Script des Eingangspostes gefunden hast, ist per ExecSQL auszuführen, je Befehl ein ExecSQL, innerhalb einer Datenbankverbindung.

Willst Du die Createstatements nicht innerhalb einer Datenbankverbindung ausführen, so musst Du nach jedem Aufbau einer neuen Datenbankverbindung ATTACH und PRAGMA neu ausführen.

Oder irre ich mich da?

Ansonsten mal hier lesen: https://www.sqlite.org/doclist.html https://www.sqlite.org/lang_attach.html https://www.sqlite.org/pragma.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 Uhr.
Seite 5 von 5   « Erste     345   

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