Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi No Such Table (https://www.delphipraxis.net/193959-no-such-table.html)

Delbor 28. Sep 2017 19:51

Datenbank: SQLite • Version: 3 • Zugriff über: FireDac

No Such Table
 
Hi zusammen

Damit versuche ich, die Tabellen der DB abzrufen:
Delphi-Quellcode:
procedure TDMLSQLite.DataModuleCreate(Sender: TObject);
begin
  FSeitenlaenge := 200;
  TPicture.RegisterFileFormat('NEF','NEF Format',TWICImage);
  Self.FDMoniFlatFileClientLink1.Tracing := False;
  Self.FDMoniFlatFileClientLink1.FileName := ExtractFilePath(Application.ExeName) + 'trace.txt';;
  Self.FDMoniFlatFileClientLink1.Tracing := true;
  Self.FDSQLiteConnection.Connected := False;
  Self.FDSQLiteConnection.Params.Clear;
  Self.FDSQLiteConnection.Params.Add('DriverID=SQLite');
  Self.FDSQLiteConnection.Params.Add('Database=M:\SQLite-DB Corner\ContentMasterData\ContentmasterData.sqlite');
  Self.FDSQLiteConnection.Connected := true;
  if Self.FDSQLiteConnection.Connected then
  begin
    Self.FDSQLiteConnection.GetTableNames('ContentmasterData','','', SQLiteTestMain.Memo2.Lines);
  end;
end;
Die Antwort von Delphi:
Zitat:

---------------------------
Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse ESQLiteNativeException mit der Meldung '[FireDAC][Phys][SQLite] ERROR: no such table: ContentmasterData.sqlite_master' aufgetreten.
---------------------------
Erstellt wurde die Tabelle so:
Delphi-Quellcode:
  function TDMLSQLite.ConnectContentmasterDB : Boolean;
  begin
    try
      FDSQLiteConnection.Connected := false;
      FDSQLiteConnection.Params.Clear;
      FDSQLiteConnection.Params.Add('DriverID=SQLite');
      FDSQLiteConnection.Params.Add('Database=M:\SQLite-DB Corner\ContentmasterData\ContentmasterData.sqlite');  
      FDSQLiteConnection.Params.Values['FailIfMissing'] := 'False';
      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.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
      if ExecuteSQL(CreateIndexTbl_Html_Tbl_CSS1) then
      if ExecuteSQL(CreateIndexTbl_Html_Tblgalerie1) then
      if ExecuteSQL(CreateTableTblMenue) then
      if ExecuteSQL(fk_tblMenue_tbl_Html1) then
      if ExecuteSQL(CreateTableTbl_Album_has_Tbl_bildtext ) then
      if ExecuteSQL(fk_tbl_Album_has_tbl_bildtext_tbl_bildtext1) then
      if ExecuteSQL(fk_tbl_Album_has_tbl_bildtext_tbl_Album1) then
      if ExecuteSQL(CreateTableTbl_Html_has_Tbl_Bildtext ) then
      if ExecuteSQL(fk_tbl_Html_has_tbl_bildtext_tbl_bildtext1) then
          if ExecuteSQL(fk_tbl_Html_has_tbl_bildtext_tbl_Html1) then
      if ExecuteSQL(CreateTableTbl_SubMenue2) then
      if ExecuteSQL(fk_tbl_SubMenue2_tbl_SubMenue11_idx) then
      if ExecuteSQL(CreateTableTbl_SubMenue1) then
      if ExecuteSQL(fk_tbl_SubMenue1_tblMenue1_idx ) then
    end;
  end;
Die Parameter der Executeaufrufe sind jeweils Funktionen, die das gewünschte SQL-Statement zurückliefern. Die vermissste Tabelle ist definitiv nicht dabei.

Gruss
Delbor

p80286 28. Sep 2017 21:07

AW: No Such Table
 
Zitat:

Zitat von Delbor (Beitrag 1382214)
Damit versuche ich, die Tabellen der DB abzrufen:
Delphi-Quellcode:
procedure TDMLSQLite.DataModuleCreate(Sender: TObject);
begin
  FSeitenlaenge := 200;
  TPicture.RegisterFileFormat('NEF','NEF Format',TWICImage);
  Self.FDMoniFlatFileClientLink1.Tracing := False;
  Self.FDMoniFlatFileClientLink1.FileName := ExtractFilePath(Application.ExeName) + 'trace.txt';;
  Self.FDMoniFlatFileClientLink1.Tracing := true;
  Self.FDSQLiteConnection.Connected := False;
  Self.FDSQLiteConnection.Params.Clear;
  Self.FDSQLiteConnection.Params.Add('DriverID=SQLite');
  Self.FDSQLiteConnection.Params.Add('Database=M:\SQLite-DB Corner\ContentMasterData\ContentmasterData.sqlite');
  Self.FDSQLiteConnection.Connected := true;
  if Self.FDSQLiteConnection.Connected then
  begin
    Self.FDSQLiteConnection.GetTableNames('ContentmasterData','','', SQLiteTestMain.Memo2.Lines);
  end;
end;
Die Antwort von Delphi:
Zitat:

---------------------------
Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse ESQLiteNativeException mit der Meldung '[FireDAC][Phys][SQLite] ERROR: no such table: ContentmasterData.sqlite_master' aufgetreten.
---------------------------

Nimm die Meldung wörtlich "Im Schema ContentmasterData gibt es keine Tabelle sqlite_master"


Zitat:

Zitat von Delbor (Beitrag 1382214)
Erstellt wurde die Tabelle so:
Delphi-Quellcode:
  .....
Die Parameter der Executeaufrufe sind jeweils Funktionen, die das gewünschte SQL-Statement zurückliefern. Die vermissste Tabelle ist definitiv nicht dabei.

Wenn die Tabelle nicht dabei ist, wie kann sie dann erstellt werden?

Kannst Du denn mit Hilfe einer DB-Shell auf die Inhalte zugreifen?

Edith:
Wenn ich die Doku richtig verstanden habe, sollte spätestens nach dem Anlegen der ersten Tabelle die Tabelle sqlite_master vorhanden sein.

Gruß
K-H

Delbor 28. Sep 2017 23:38

AW: No Such Table
 
Hi p80286

Zitat:

Kannst Du denn mit Hilfe einer DB-Shell auf die Inhalte zugreifen?
Der SQLite Express zeigt mir die DB, die Tabellen und die Feldstrukturen richtig an.
Zitat:

Nimm die Meldung wörtlich "Im Schema ContentmasterData gibt es keine Tabelle sqlite_master"
Das tue ich.
Zitat:

Wenn die Tabelle nicht dabei ist, wie kann sie dann erstellt werden?
Indem sie von SQLite erstellt wird? Zum speichern der Tabellenbeziehungen und Indexe?
Zitat:

Wenn ich die Doku richtig verstanden habe, sollte spätestens nach dem Anlegen der ersten Tabelle die Tabelle sqlite_master vorhanden sein.
Zur Zeit bin ich gerade dabei, mir Dokuteile via Google-Übersetzer in Word zu übertragen(Die virtuelle Datenbank-Engine von SQLite).

Ich nehme mal an, dass Firedac für die Befehlszeilen-Beispiele da auch Unterstützung bietet - wobei ich mir andrerseits eigentlich vorstelle, dass SQLite seine Systemtabellen selbst erstellt/erstellen sollte...

Gruss
Delbor

Delbor 29. Sep 2017 01:39

AW: No Such Table
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen

Die von Firedac vermisste Tabelle ist vorhaanden und enthält Daten. Im Anhang ein Screnshot des SQL Experts...
Das Problem liegt also bei Firedac...

Gruss
Delbor

PS: Das Problem hat sich in Luft aufgelöst:
Delphi-Quellcode:
  if Self.FDSQLiteConnection.Connected then
  begin
    Self.FDSQLiteConnection.GetTableNames('ContentmasterData','','', SQLiteTestMain.Memo2.Lines);
  end;
habe ich mal ersetzt durch:

Delphi-Quellcode:
Self.FDSQLiteConnection.GetTableNames('','','', SQLiteTestMain.Memo2.Lines);

jobo 29. Sep 2017 06:53

AW: No Such Table
 
Ich schätze, da stiftet mal wieder der Schemaname Verwirrung.
Lass "ContentmasterData" weg bei gettablenames
oder definiere ContentmasterData als Schemaname
oder tausche ContentmasterData gegen "main". Das ist der Default.

Schemaname und Dateiname sind 2 unterschiedliche Dinge. Die Datei kann heißen wie sie will. Der Schemaname lautet dann als default "main" und kann sowieso weggelassen werden.
Wenn Du ihn bei der Abfrage verwendest, dann musst Du ihn zuvor mit attach definieren.

nahpets 29. Sep 2017 09:05

AW: No Such Table
 
Ausgehend von http://docwiki.embarcadero.com/Libra....GetTableNames waren in der Ursprungsversion die Parameter falsch gesetzt.

Wenn Du die Tabellennamen aus dem Schema ContentmasterData abfragen möchtest, dann musst Du ContentmasterData auch als Schemaname angeben, dies ist der zweite Parameter.

Delbor 29. Sep 2017 12:28

AW: No Such Table
 
Hi zusammen

Vielen Dank für eure Antworten!
Zitat:

Schemaname und Dateiname sind 2 unterschiedliche Dinge. Die Datei kann heißen wie sie will. Der Schemaname lautet dann als default "main" und kann sowieso weggelassen werden.
Wenn Du ihn bei der Abfrage verwendest, dann musst Du ihn zuvor mit attach definieren.
Ich hab, trotz Wikipedia, so meine Probleme mit der Unterscheidung <Schemaname-Catalogname>. Bei meinen ersten Versuchen mit Firedac gings darum, mittels GetSchemaName, bzw. GetCatalogName (damals noch unter MySQL) den Schema- oder Catalognamen abzurufen. Erhalten habe ich einen mit dem Datenbanknamen identischen String.

Zitat:

Wenn Du die Tabellennamen aus dem Schema ContentmasterData abfragen möchtest, dann musst Du ContentmasterData auch als Schemaname angeben, dies ist der zweite Parameter.
Ohne jetzt Wikipedia zu konsultieren, um zu prüfen, ob ich das jetzt wenigstens halbwegs intus habe:
Der Schemaname bezeichnet den Datenbanknamen inklusive des zugrundeliegenden Tabellen- und Felder - Aufbau-Schemas.
Der Catalogname hingegen nur den blossen Datenbanknamen. Richtig?

Zitat:

Wenn Du ihn bei der Abfrage verwendest, dann musst Du ihn zuvor mit attach definieren.
Mein bisheriges Verständnis von SQLite:
SQLite ist eine 'Anwendungsorientierte' (meine Definition), eben eingebettete Datenbank. Von daher ist von vornherein klar, welche Datenbank, welches Datenbankschema gemeint ist. Per Default eben 'main'. Wobei 'main' auch dann das aktuelle Schema ist, wenn ich der Verbindung mit 'ATTACH' eine weitere DB hinzugefügt habe - eine explizite Adressierung der hinzugefügten DB á la "Contentmasterdat.Bildtabelle" ist deshalb nicht zulässig.

Gruss
Delbor

bra 29. Sep 2017 13:06

AW: No Such Table
 
Ich glaube, du verwechselst da was. Datenbankname und Datenbankschema sind was vollkommen unterschiedliches. Eine Datenbank kann mehrere Schemas enthalten (zumindest bei einigen Datenbanken wie MSSQL), bzw. sind die Schemas an Datenbank-Benutzer gebunden.

nahpets 29. Sep 2017 15:59

AW: No Such Table
 
Eine Datanbank kann n Schemas enthalten, ein Schema kann n Tabellen enthalten.

In der Regel meldet man sich an der Datenbank an und "landet" dann in dem der Anmeldung zugeordneten Schema. Dort kann man dann per
SQL-Code:
select * from tabelle
auf Tabellen zugreifen. Es wird dann die implizite Annahme gemacht, dass man eine Tabelle aus dem Anmeldeschema meint.

Möchte man auf eine Tabelle in einem anderen Schema zugreifen, wird der Schemaname mit im SQL angegeben:
SQL-Code:
select * from schema.tabelle
.

Manche Datenbanken unterstützen auch datenbankübergreifende Abfragen:
SQL-Code:
select * from datenbank.schema.tabelle
In diesem Zusammenhang wird zuweilen dann auch von Katalog gesprochen.

Wenn Du bei Deinem Programm eine Anmeldung hast, die Dich sofort in das Schema Contentmasterdata "bringt", kannst Du diese Angabe auch weglassen. Dies macht die Statements dann auch übersichtlicher.

Verwirrend wird es oft, wenn man in einer Datenbank ein Schema hat, das dem Datenbanknamen entspricht. Also ungefähr sowas:
SQL-Code:
select * from Contentmasterdata.Contentmasterdata.tabelle
Hier ist die Verwirrung fast immer vorprogrammiert.

Allerdings ist das zuweilen von Datenbank zu Datenbank auch schonmal individuell unterschiedlich.

Welche spezifischen Besonderheiten für sqlite gelten, weiß ich nicht.

p80286 29. Sep 2017 20:49

AW: No Such Table
 
@Nahpets
In diesem Falle liegt das Problem wohl darin, daß Firedac eine Funktion zur Verfügung stellt (GetTableNames) die u.U. mißverständliche Parameternamen besitzt.
Deine Beispiele beziehen sich ja leider nur auf pures SQL, da weiß man natürlich was man hat.
ADO stellt etwas ähnliches zur Verfügung und leider ist die Ausgabe auch in diesem Falle nicht das was man auf den ersten Blick erwartet.
Daher ist das Vermeiden solcher Funktionen meiner Meinung nach unbedingt notwendig, will man zuverlässige Daten erhalten.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 Uhr.
Seite 1 von 2  1 2      

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