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
Delbor

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

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 12:42
Hi zusammen

@TigerLilly
So, wie ich das verstanden habe, sind das zwei Mögliche Schreibweisen.

@nahpets:
Soeben ausprobiert - und scheint genau so zu sein. Jedenfalls ist jetzt die Fehlermeldung anders:
Zitat:
---------------------------
Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse ESQLiteNativeException mit der Meldung '[FireDAC][Phys][SQLite] ERROR: unable to open database file' aufgetreten.
---------------------------
Eigentlich bin ich es von MySQL-Workbench gewohnt, wenn ich ein Forward-Engineering mache, um die entworfene DB zu erstellen, muss ich vorher einen Ordner erstellen und diesen als "Datenbank" angeben. Ist hier wohl auch nicht anders - bisher war ich nur etwas irritiert, weil eine "DB" mit verknüpfung zum sqlite-Expert angelegt wurde.

War aber Fehlanzeige - selbe Fehlermeldung...
Aktuelle Pfadangabe[13:45]:
['Database']:='"M:\SQLite-DB Corner\ContentMasterData\ContentMasterData.sqlite"';
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 ( 7. Sep 2017 um 12:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

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

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 13:10
>So, wie ich das verstanden habe, sind das zwei Mögliche Schreibweisen.

Naja, nur, wenn es "Database" schon gibt.
  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 7. Sep 2017, 13:21
Hi zusammen

Die letzte gezeigte Fehlermeldung hatte eine Besonderheit: Das, was ich hier gepostet habe, war eine Kopie aus dem Editor, und da endete die Meldung mit einem '.
Nachdem ich die Meldung mit Fortsetzen qittiert hatte, erschien sie in einem Meldungsfenster auf meiner Programmoberfläche - aber diesmal ohne das Hochkomma am Schluss...
Nun ja, ich hab dann doch mal TigerLillys Vorschlag ausprobiert und das 'm' in 'ContentMasterData' durch ein grosses seiner Art ersetzt. So, wie es in allen meinen SQL-Strings steht.
Und jetzt ist die Fehlermeldung wieder:

Zitat:
---------------------------
Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse ESQLiteNativeException mit der Meldung '[FireDAC][Phys][SQLite] ERROR: unknown database "ContentMasterData"' aufgetreten.
---------------------------
Ich hatte in dem Ordner einen UnterOrdner ContentMasterData angelegt. Der ist nach wie vor leer.
Stattdessen habe ich jetzt wieder einen solchen mit der Endung sqlite.
Den gelöscht und...
das Spielchen geht von vorne los....

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
Delbor

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

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 13:42
Hi TigerLilly
Zitat:
>So, wie ich das verstanden habe, sind das zwei Mögliche Schreibweisen.

Naja, nur, wenn es "Database" schon gibt.
Das explizite leeren des Parameters vor der Zuweisung hat auch nichts gebracht.

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
jobo

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

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 14:29
Aus Deinem Delphicode geht nun derzeit nicht hervor, was du in den einzelnen Abschnitten wirklich als DML Script übergibst.
Ebenso sehe ich nicht, wo dieser Fehler geschieht (welche Zeile in Delphi).

Also weitere Vermutungen:
Wenn Du lediglich das Attach rausgeworfen hast, den Rest aber belassen wie zu Anfang aufgeführt, ist das logische Schema "ContentMasterData." aus der Create Anweisung nicht mehr bekannt.
Also entweder Attach UND Schemaschreibweise entfernen
oder
beides wie generiert belassen.
oder
Attach weglassen und Schemaschreibweise auf "main".

Betreibt man tatsächlich mehrere DB attachted, kann einem das Weglassen des Schemas offenbar ziemliche Schmerzen verursachen (laut Doku).
Gruß, Jo
  Mit Zitat antworten Zitat
Delbor

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

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 15:47
Hi jobo

Das sind die ersten Zeilen des Scripts, so wie es von Workbench exportiert wurde:

Zitat:
-- Creator: MySQL Workbench 6.3.8/ExportSQLite Plugin 0.1.0
-- Author: Roger
-- Caption: Delbor-Database-Modell
-- Project: DelborpunktCH
-- Changed: 2017-04-18 16:20
-- Created: 2012-06-16 09:09
PRAGMA foreign_keys = OFF;

-- Schema: ContentMasterData
ATTACH "ContentMasterData.sdb" AS "ContentMasterData";
BEGIN;
Davon wurden alle ausser der PRAGMA-Zeile Opfer meines 'Sauberkeitsfimmels'.
Das Script selbst findest du im Anhang.


Zitat:
Aus Deinem Delphicode geht nun derzeit nicht hervor, was du in den einzelnen Abschnitten wirklich als DML Script übergibst.
Alle CREATE TABLE-Konstrukte im Anhang werden einzeln von insgesamt 12 Funktionen zurückgeliefert. ExecSQL führt also im Endeffekt das bis auf die obigen Zeilen (und das commit am Schluss)komplette Script aus.

Zitat:
Ebenso sehe ich nicht, wo dieser Fehler geschieht (welche Zeile in Delphi).
Der Fehler tritt auf, nachdem (oder eben wenn) ExecSQL ausgeführt wird/Werden sollte.

Zitat:
Also entweder Attach UND Schemaschreibweise entfernen
oder
beides wie generiert belassen.
oder
Attach weglassen und Schemaschreibweise auf "main".
ATTACH "ContentMasterData.sdb" AS "ContentMasterData";

Verstehe ich dich richtig? Das würde also z.B. so ausehen:
DMLSQLite.FDSQLiteConnection.Params.Add(ATTACH "ContentMasterData.sdb" AS "ContentMasterData";)
oder:

DMLSQLite.FDSQLiteConnection.Params.Add(main;) Aber vielleicht krieg ich ja doch noch den Durchblick.

TigerLillly schrieb:

Zitat:
Naja, nur, wenn es "Database" schon gibt.

Und die gibts ja auch - nämlich die, welche ich in meinem ersten Post gezeigt habe - die basiert auf der selben sqlite.dll, im selben Anwendungsverzeichnis.
Und genau deswegen muss nun mit Attach die neue DB hinzugefügt werden. Richtig?

Und zu Tigerlilly: Ich hab mir die Params inzwischen angesehen; sie sind auch im Anhang zu finden.

Ich arbeite mit DelphiXE8 unter Firedac.

Gruss
Delbor
Angehängte Grafiken
Dateityp: jpg ConnectionParams.JPG (15,5 KB, 6x aufgerufen)
Angehängte Dateien
Dateityp: pas ContentmasterDataCreate SQLscript.pas (7,0 KB, 3x aufgerufen)
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 ( 7. Sep 2017 um 15:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

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

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 15:01
Schau dir doch mal an, was in Params - das sollte doch eine StringList sein - wirklich drinsteht:
> DMLSQLite.FDSQLiteConnection.Params.Values['Database']:='M:\SQLite-DB Corner\ContentmasterData\ContentmasterData.sqlite' ;

und zwar vor dieser Zeile:
> DMLSQLite.FDSQLiteConnection.Connected := true;

Welche Delphi Version verwendest du + sind das FireDac Komponenten?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 15:58
Da mir vollkommen schleierhaft ist, wo denn genau der Fehler nun passiert, mal folgenden Vorschlag einer veränderten Prozedure:
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;

function TDMLSQLite.ConnectContentmasterDB : Boolean;
begin
  try
    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
    on E: EDatabaseError do begin
      ShowMessage('Fehler beim Aufbau der Datenbankverbindung: ' + #13#13 + E.Message);
      Result := False;
    end;
  end;
end;

procedure TDMLSQLite.ContentmasterDBCreate;
begin
  if ConnectContentmasterDB then begin
    if ExecuteSQL(Createbilddescribetabelle) then
    if ExecuteSQL(Createbilddescribetabelle_has_HtmlTabell) then
    if ExecuteSQL(Createbildtabelle) then
    if ExecuteSQL(CreateCSSTabelle) then
    if ExecuteSQL(Creategalerietabelle) then
    if ExecuteSQL(CreateHTMLTable) then
    if ExecuteSQL(CreateJavascriptTable) then
    if ExecuteSQL(Createkategorien_tabelle) then
    if ExecuteSQL(Createkategorien_tabelle_has_bildDescribeTabelle) then
    if ExecuteSQL(CreateMenueTabelle) then
    if ExecuteSQL(CreateSubMenue2Table) then
    if ExecuteSQL(CreateSubmenuetabelle) then ShowMessage('Das war wohl nix!');
  end;
end;
Damit könnte dann erkennbar werden, ob der Fehler bereits bei der Herstellung der Datenbankverbindung auftritt oder erst im späteren Verlauf.
Wenn im späteren Verlauf, wird das fehlerverursachende Statement zusammen mit der Fehlermeldung ausgegeben.

Dies könnte ggfls. die Fehlerursachenforschung deutlich vereinfachen.

Und das ist nur ein Vorschlag, den man strukturell sicherlich noch deutlich verbessern könnte.

Eine noch bleibende Fehlerursache ist, dass bei FDSQLiteConnection.Params.Values davon ausgegangen wird, dass die Paramter schon vorhanden sind. Eventuell zusätzlich vorhandenen Parameter werden nicht geprüft und könnten ggfls. zu unerwünschten Nebenwirkungen führen.

Sinnvoll (und meiner Meinung nach zwingend) ist es, die Parameterliste nach dem Beenden der Verbindung zu leeren und dann die gewünschten Parameter in die Liste einzufügen.
TigerLilly hat da ja, durchaus berechtigt, schon drauf hingewiesen.

Dann schreibst Du einerseits
ATTACH "ContentMasterData.sdb" AS "ContentMasterData";
und andererseits

DMLSQLite.FDSQLiteConnection.Params.Values['Database']:='M:\SQLite-DB Corner\ContentmasterData\ContentmasterData.sqlite';
Wo wird der Zusammenhang zwischen ContentMasterData.sdb und ContentmasterData.sqlite hergestellt?
Das ist mir nicht klar, könnte das gglfs. eine Fehlerursache sein?

Zumindest hätte ich da eher sowas erwartet:

ATTACH "ContentMasterData.sqlite" AS "ContentMasterData";
Aber da mag ich mich wohl auch irren.

Geändert von nahpets ( 7. Sep 2017 um 16:02 Uhr) Grund: Schreibfehler behoben, sehe ich immer zu spät :-(
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

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

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 16:46
Ich weiß nicht recht, irgendwas geht da durcheinander.

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?

Gibt es die Datenbank nicht, so wird sie angelegt. Ich glaube, das hattest du gesagt, dass das passiert.

Der Fehler tritt auf, sobald connected auf true gesetzt wird - richtig? Oder erst später, bei den SQL Statements?

Das ATTACH gehört jedenfalls zu den SQL Anweisungen.

Möchtest du die .db öffnen oder die .sqlite?
Warum öffnest du eine andere DB als du dann bearbeiten willst (=die die du mit ATTACH öffnest)?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

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
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 03:54 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