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
Benutzerbild von p80286
p80286

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

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 17:27
Das was Jobo oben geschrieben hat etwas anders formuliert.

Wenn ich das richtig interpretiere,#14, dann wurde in der Datei .....Contentmaster\Contentmaster.sqlite
eine dataBase mit dem namen "main" angelegt.
Jetzt gibt es zwei Möglichkeiten:
a) nach dem Connect wird mit "main" gearbeitet, also Create Table "main.meinetabelle" ..... oder
b)das ATTACH Statement wird ausgeführt, dann kann man auf "Contentmaster.Meinetabelle" zugreifen.
Create Table "Contentmaster.Meinetabelle" ..... Eine (SQL-)DATABASE is eine logische Struktur deren physikalische Struktur eine Datei sein kann, aber nicht sein muß. Bevor Du mit der logischen database arbeiten kannst, mußt Du ihr einen phys. Speicher zuweisen bzw. wenn Du eine Datei hast muß diese mit einem Name, der DATABASE versehen werden.

Ich hoffe, das ist einigermaßen verständlich.

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

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 20:19
Das was Jobo oben geschrieben hat etwas anders formuliert.
Genau.

Ich schätze das Problem hier ist:
Das verwendete Tool generiert ein Script, Delphi SQL Componenten arbeiten aber meist Statement basiert.
Die Vermischung (oder (unvollständige) "Säuberung") von Script Elementen ist kontraproduktiv.

Kurze Lösung, lade Dir (wenn nicht vorhanden) sqlite3.exe und rufe folgendes aus einer cmd box auf:
Code:
sqlite3 testdb < script.sql
wobei in der Notation alles in einem Verzeichnis liegen muss oder sqlite3.exe im Suchpfad stehen muss.
testdb = irgendeine nicht existierende Datei
script.sql = Dein Script wie es von deinem Konvertierungstool ausgespuckt wurde.

Wenn in dem Rest (nicht von Dir veröffentlicht) keine Fehler des Konvertierungstools stecken wird es einfach durchlaufen.
Anschließend hast Du jenachdem mindesten eine Datei mehr in dem Verzeichnis, nämlich "ContentMasterData.sdb"

Ich habe hier deine Vorgabe noch etwas erweitert. Probier es mit der Kommandozeile oben aus, dann wird Dir auch klar, was es mit Deinen Connectioneinstellung in den Delphikompos auf sich hat. Schau dann mal in die Datei 'testdb' rein, mit einem sqlite tool.
Und natürlich in die Datei ContenMasterData.sdb.


Code:
-- keine fk prüfung
PRAGMA foreign_keys = OFF;
-- ist sowieso egal ohne definierte fk

-- benutze Datei ContenMasterData.sdb und nimm den logischen Bezeichner ContentMasterData
ATTACH "ContentMasterData.sdb" AS "ContentMasterData";
BEGIN;
CREATE TABLE "ContentMasterData"."bildtabelle"(
                                "idBild" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK("idBild">=0),
                                "Thumbnail" BLOB,"Bitmap" BLOB,
                                "Jpeg" BLOB,
                                "FolderId" VARCHAR(32));


CREATE TABLE "ContentMasterData"."galerietabelle"(
                                "Gallery_ID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK("Gallery_ID">=0),
                                "GalleryName" VARCHAR(50));

CREATE TABLE "ContentMasterData"."CSS-Tabelle"(
                                "idCSS" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK("idCSS">=0),
                                "PageCSS" LONGTEXT NOT NULL,"MenueCSS" LONGTEXT NOT NULL);
                               
insert into ContentMasterData."bildtabelle" ("Jpeg" , "FolderId" ) values( null, '../das/ist/ein/Relativpfad/xy.jpg')    ;

-- mal ohne die Anführungszeichen
insert into ContentMasterData.galerietabelle (GalleryName ) values( 'Erste Bildreihe');  
     
-- "sonderzeichen" geht nicht ohne Anführungsstriche
insert into ContentMasterData."CSS-Tabelle" (PageCSS , MenueCSS ) values( 'some page css', 'some menu css');

-- jetzt mal ohne die Schemaangabe
create table jobotesttable (aID integer, aText varchar(50));
insert into jobotesttable values (1,'jobo');

-- dedizierter, logischer Zugriff auf default aka main Schema
insert into main.jobotesttable values (null,'main.Jobo');

end;
Wenn Du mit Delphi auf ContentMasterData verbinden willst, per DelphiCode bzw. Properties, nimmst Du das vorweg, was das Script selbst macht. Das funktioniert sicher nicht gut. Die Komponenten kenne ich nicht, deswegen kann ich Dir dazu nichts sagen.
Letztlich würde ich meinen Tipp wiederholen, hier nicht groß mit Delphi rumzuwirbeln, sondern per Command Line das Script laufen zu lassen. Notfalls per ShellAPI innerhalb Deines Programms.

Achso und nochmal anders formuliert.
Wenn Du attach weglässt, dann lasse auch die vorgeschaltete Schemabezeichnung in den restlichen Scriptanweisungen weg.
Zum Spaß kannst Du ja auch noch mal Dein Konvertierungstool anwerfen und 2 Datenbanken scripten lassen. Im Ergebnis wird dann vielleicht auch klarer, was das Teil mit dem attach macht.
Gruß, Jo

Geändert von jobo ( 7. Sep 2017 um 20:25 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 20:35
Und irgendwo stand noch, dass man die Daten nicht mit Transkationen lädt.

Ich würde sagen, natürlich macht man das. Dafür sind sie da.
sqlite schwächelt da leider und verhält sich nicht so, wie das m.E. sein soll.
Ist aber ein anderes Thema. Kann man ja bei Bedarf separat klären.
Gruß, Jo
  Mit Zitat antworten Zitat
Delbor

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

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 10:26
Hi zusammen

Nach längerm Suchen (inklusive überlesen...) hab ich da was interessantes gefunden:
Zitat:
Verwenden von mehreren SQLite-Datenbanken in einer Delphi-Anwendung

SQLite ermöglicht die Verwendung mehrerer Datenbanken in einer einzelnen Verbindung. Eine im Parameter Database angegebene DB ist die Hauptdatenbank. Um weitere Datenbanken hinzuzufügen, muss in der Delphi-Anwendung die ATTACH-Anweisung verwendet werden. Zum Beispiel:

Delphi-Quellcode:
 FDConnection1.ExecSQL('ATTACH ''c:\hr.sdb'' AS hr');
 FDConnection1.ExecSQL('ATTACH ''c:\cust.sdb'' AS cust');
 FDQuery1.Open('select * from "Orders" o ' +
   'left join hr."Employees" e on o.EmployeeID = e.EmployeeID ' +
   'left join cust."Customers" c on o.CustomerID = c.CustomerID');
Mit der von mir immer wieder erwähnten Connection-Komponente hab ich die Eingangs gezeigte DB erstellt. Laut diesem Artikel ist dies somit die 'Hauptdatenbank' in dieser Verbindunng. Alle weiteren Datenbanken müssen nun also mit ATTACH der Verbindung hinzugefügt werden.
Dies hatte ich ja erstmal so versucht:

DMLSQLite.FDSQLiteConnection.Params.Add('ATTACH "ContentMasterData.sdb" AS "ContentMasterData";');

Tigerlilly meinte dazu:
Zitat:
DMLSQLite.FDSQLiteConnection.Params nimmt NUR angaben zur Verbindung zur Datenbank auf. Ein Attach hat da nichts verloren.
Im Screenshot ist eine Datenbank mit .db angegeben, im Code .sqlite. Ist das ein Typo?
Hmm, Tigerlilly, in welchem Screenshot? Die eingeschwärzten Bildschirmschüsse zeigen ewinen Ausschnitt meiner Programmoberfläche. Das kann ein Tippfehler sein, ist aber wohl eher ein C&P-Fehler.

Gemäss dem oben gezeigten Codeschnipselfund werde ich jetzt erstmal zusehen, dass ich die ATTACH-Anweisung richtig hinkrieg.

Zitat von Jobo:
Zitat:
Ich schätze das Problem hier ist:
Das verwendete Tool generiert ein Script, Delphi SQL Componenten arbeiten aber meist Statement basiert.
Was ist denn der Unterschied zwischen einem Script und einem SQL-Statement? Nach meiner Interpretation erstmal wohl keiner; beide sind reiner Asccii-Text und werden interpretiert.
Wobei ein VB-Interpreter mit Select wohl erst mal nicht viel anfangen kann, eine SQL-Engine hingegen mit Dim hingegen genauso überfordert ist. Wobei der VB-Interpreter ein Select-Statement als String entgegennehmen und ihn an die SQL-Engine weiterreichen kann.

So, wie ich das sehe, enthält dieses Script nichts weiter als ein mehr oder weniger komplexes SQL-Statement, um damit mit der SQLite-Engine (SQLite3.dll) eine SQLite-DB zu erstellen.

Im Anhang zeigt ein jpeg die auf meinem System gefundenen sqlite.exe-Dateien, wobei mindestens eine davon eine Installationsdatei ist.


Gruss
Delbor
Angehängte Grafiken
Dateityp: jpg sqlite-exe-Suche.JPG (28,0 KB, 5x 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
Benutzerbild von TigerLilly
TigerLilly

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

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 10:42
Ja, genau. Das ATTACH muss aber mit ExecSQL ausgeführt werden, nicht in den Params.

Der Unterschied zwischen SQL Abweisung und SQL Script ist nur, dass eine SQL Anweisung eine einzelne Anweisung ist, das Script aber aus mehreren Anweisungen besteht. In der Regel ist das für die Delphi Komponenten kein Unterschied, weil der ganze Text an die Datenbank zur Abarbeitung geschickt wird.

Ich habe es jetzt nicht im Kopf, aber es kann vereinzelt ein Problem mit einem Script geben, wenn Delphi das SQL Statement parsen muss, um zB Parameter zu setzen oder ein Update-SQL zu generieren. Oder wenn Feldnamen extrahiert werden müssen. Aber das ist da ja nicht der FAll.

Ich persönlich mag es lieber, wenn die Statements einzeln ausgeführt werden, dann sehe ich besser, wo ein Fehler auftritt + ich kann auch nach jedem Statement dem Benutzer Feedback geben + den Fortschritt anzeigen.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 11:27
Der Unterschied zwischen SQL Abweisung und SQL Script ist nur, dass eine SQL Anweisung eine einzelne Anweisung ist, das Script aber aus mehreren Anweisungen besteht. In der Regel ist das für die Delphi Komponenten kein Unterschied, weil der ganze Text an die Datenbank zur Abarbeitung geschickt wird.
Der Unterschied scheint recht klein zu sein, einfach mehr von dem gleichen, aber die Konsequenzen sind leider so, dass die meisten Delphi SQL Komponenten keine Scripte verarbeiten. Das ist nicht mal nur bei Delphi so.

Und wenn man nun Delphi Componenten nutzt, die gewisse Datenbank-Features als Attribute anbieten, Transaktionseinstellungen, i18 settings usw, dann dürfte klar sein, dass es Probleme gibt, wenn man in einem Script oder auch nur einer einzelnen SQL Query widersprechende Anweisungen absetzt.
Gruß, Jo
  Mit Zitat antworten Zitat
Delbor

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

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 12:18
Hi zusammen

Ich hab das mal so umgesetzt:
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;
    SQLString := SQLString + Createbilddescribetabelle_has_HtmlTabell;
    SQLString := SQLString + Createbildtabelle;
    SQLString := SQLString + CreateCSSTabelle;
    SQLString := SQLString + Creategalerietabelle;
    SQLString := SQLString + CreateHTMLTable;
    SQLString := SQLString + CreateJavascriptTable;
    SQLString := SQLString + Createkategorien_tabelle;
    SQLString := SQLString + Createkategorien_tabelle_has_bildDescribeTabelle;
    SQLString := SQLString + CreateMenueTabelle;
    SQLString := SQLString + CreateSubMenue2Table;
    SQLString := SQLString + CreateSubmenuetabelle;
    DMLSQLite.FDSQLiteConnection.ExecSQL(SQLString);
  except
    on E: EDatabaseError do
     ShowMessage('Exception raised with message' + E.Message);
  end;
end;
Wie gesagt: Beim 2. ExecSQL krachte es. Hmm, ich bin mir jetzt nicht mehr sicher, aber ich glaube mich an ein Tut zu erinnern, dass nach jeder Create-Anweisung ein ExecSQL durchführte. Der Grund könnte sein: Durch meine Aufteilung der einzelnen TableCreate-Statements und deren wiederzusammenführung in einem einzelnen SQLString hab ich wohl Leerzeichen zwischen den einzelnnen Anmweisungen entfernt, so dass da nun Konstrukte vorhanden sind wie
Zitat:
"...("CSS-Tabelle_idCSS");''CREATE TABLE "ContentMasterData..."
Und damit dürfte wohl jede SQL-Engine so ihre Probleme haben. Wobei auch das ein Grund sein könnte:
Zitat:
aber die Konsequenzen sind leider so, dass die meisten Delphi SQL Komponenten keine Scripte verarbeiten.
Gestern abend habe ich mir mal den Codevorschlag von nahpets (#24) runtergeladen. Ich werdes mal mit dem probieren.

Gruss
Delbor
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
Benutzerbild von p80286
p80286

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

AW: Automatiach erstellte Syntax

  Alt 8. Sep 2017, 11:00
Was ist denn der Unterschied zwischen einem Script und einem SQL-Statement? Nach meiner Interpretation erstmal wohl keiner; beide sind reiner Asccii-Text und werden interpretiert.
Ein Script enthält (meist) mehrere Statements. Z.B.
SQL-Code:
select * from table1;
delete from table2 where id=12345;
update table4 set wert=1234 where id=6789;
Wobei ein VB-Interpreter mit Select wohl erst mal nicht viel anfangen kann, eine SQL-Engine hingegen mit Dim hingegen genauso überfordert ist. Wobei der VB-Interpreter ein Select-Statement als String entgegennehmen und ihn an die SQL-Engine weiterreichen kann.
Ich vermute, Da hast Du etwas mißverstanden.

Zitat:
Create A New Database

•At a shell or DOS prompt, enter: "sqlite3 test.db". This will create a new database named "test.db". (You can use a different name if you like.)


•Enter SQL commands at the prompt to create and populate the new database.


•Additional documentation is available here.
von https://sqlite.org/quickstart.html

Gruß
K-H

Edith:
Ich habe es jetzt nicht im Kopf, aber es kann vereinzelt ein Problem mit einem Script geben, wenn Delphi das SQL Statement parsen muss, um zB Parameter zu setzen oder ein Update-SQL zu generieren. Oder wenn Feldnamen extrahiert werden müssen. Aber das ist da ja nicht der FAll.
Den Delphi-Query-Komponenten kannst Du nur Statements übergeben. Um ein Script zu verarbeiten benötigst Du die entsprechende DB-Shell.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 ( 8. Sep 2017 um 11:04 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:41 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