Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugriff (https://www.delphipraxis.net/40712-fragen-fb-sql-befehle-tzconnection-datenbankdateizugriff.html)

Panthrax 19. Feb 2005 19:41

Datenbank: Firebird Embedded Server • Version: 1.5 • Zugriff über: Zeos Komponenten

Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugriff
 
Hallo.

Ich benutze: Zeos (Komponenten TZConnection, TZQuery) und Firebird Embedded Server

Ich möchte Folgendes erreichen:
  • eine lokale Datei als Datenbank benutzen
  • auf die (Datenbank-)Datei als Programm zugreifen

aufs Wesentliche vereinfacht soll das dann so aussehen:
Delphi-Quellcode:
...
    // in der Klassendefinition
    ZConnection1 :TZConnection;
    ZQuery1 :TZQuery;
...
  // mitteilen, dass eine neue Datenbank angelegt werden soll
  ZConnection1.Properties.Add('CreateNewDatabase=CREATE DATABASE ''MyDB.fdb'' '+
    'PAGE_SIZE 8192 USER ''SYSDBA'' PASSWORD ''masterkey'' '+
    'DEFAULT CHARACTER SET ISO8859_1');
  ZConnection1.Connect;
  // Firebird anweisen, Datenbank und Datei zu schließen
  ZQuery1.SQL.Add('EXEC SQL');
  ZQuery1.SQL.Add('  DISCONNECT ALL;');
  ZQuery1.SQL.ExecSQL; ZQuery1.SQL.Clear; {1}
  ZConnection1.Disconnect; // <-- überhaupt nötig?
...
  // an dieser Stelle würde ich gern mit der Datei selbst arbeiten
  // (später räumliche und zeitliche Trennung hier)
...
  ZConnection1.Connect; // <-- überhaupt nötig?
  // Firebird anweisen, Datenbank und Datei zu öffnen
  ZQuery1.SQL.Add('EXEC SQL');
  ZQuery1.SQL.Add('  CONNECT ''MyDB.fdb'' AS DB1;');
  ZQuery1.SQL.ExecSQL; ZQuery1.SQL.Clear;
  ZConnection1.Disconnect;
...
Der Quelltext soll das Ziel zeigen. Im Test scheitert er an der Zeile {1} mit der Exception die sagt, das er das Token "EXEC" nicht kennt:

SQL Error: Dynamic SQL error code = -104 Token unknown - line 1, char 1 EXEC. Error Code: -104. Invalid token The SQL: EXEC SQL DISCONNECT ALL;

Sinngemäß soll folgendes passieren:
  • eine Verbindung zu Firebird Embedded Server herstellen
  • Datenbanken erstellen (also Testweise ersteinmal eine)
  • die entstandenen (Datenbank-)Dateien weiterverarbeiten
  • über Firebird Embedded Server zu den Datenbanken verbinden

Meine Probleme auf diesem Weg sind:

(1) ZConnection verlangt immer die Angabe einer Datenbank?

Ich möchte gern die SQL-Befehle benutzen um Datenbanken zu erstellen. ZConnection möchte aber immer vor Verbindungsaufbau eine Datenbank genannt bekommen. Selbst wenn ich den Umweg gehen muss, für jede Datenbank eine extra Connection aufzubauen: Wie kann ich mich mit Firebird verbinden um dann SQL-Befehle auzufühen? - Das bringt mich schon zu meinem nächsten Problem:

(2) Ich kann nicht alle SQL-Befehle nutzen?

Wie oben im Beispiel mit DISCONNECT gezeigt gilt dies auch für CONNECT, SET SQL DIALECT 3, ... Selbst wenn die Zeile EXEC SQL falsch sein sollte und ich sie auskommentiere, entsteht der gleiche Fehler mit gleichartigem Inhalt.
Als Referenz für die SQL-Kommandos benutze ich den Embedded SQL Guide dessen Link auf dieser Firebird-Seite (unter "Interbase 6.0 manuals/Embedded SQL Guide) zu finden ist. Dort wird gezeigt, wie man Datenbanken öffnet (Seite 41) und sie wieder schließt (Seite 49). - Ich verstehe nicht warum ich u.a. diese Befehle nicht nutzen kann, obwohl ich mich mit Firebird unterhalte.

(3) Wie kann Firebird dazu gebracht werden eine Datei zu schließen? (So, dass man selbst Zugriff auf die Datei haben kann.)

Nach einem ZConnection1.Disconnect; hat Firebird leider immernoch die Finger auf der Datenbankdatei. Ich möchte sie jedoch gern weiterbearbeiten und möchte das Firebird mitteilen. Wie geht das, wenn nicht durch Disconnect?

Hm... Viele Fragen, wenig Antworten. Bitte um Hlfe.

Panthrax

kiar 19. Feb 2005 19:56

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
hallo,

viele antworten auf deine fragen findest du hier:

http://www.seeger-net.com/Delphi/FBE...FBEmbedded.htm

raik

Panthrax 19. Feb 2005 20:34

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
Nein, finde ich leider nicht.

TZConnection ist eine Komponente der Zeos Komponenten. Und zu denen wird dort ankündigend gasagt: "Diesem Artikel wird eine Fortsetzung folgen. (...) Auch auf den Einsatz der ZEOS Library als Freeware-Alternative für den Datenbankzugriff, möchte ich in diesem zweiten Teil eingehen."

SQL-Befehle werden nicht ansatzweise ausreichend behandelt, um mir weiterhelfen zu können.

Und zum Umgang mit Firebird aus dem eigenen Programm heraus wird nicht eingegangen.

Es wird erklärt, wie Firebird Embedded Server "installiert" wird und wie man mit Hilfe der Programme IBOConsole und Interbase DataPump v3.4 direkt an den Datenbanken arbeiten kann. Es wird auch gezeigt, wie man mit Hilfe dieser Programme zum Firebird Embedded Server migieren kann. Das hilft mir aber nicht weiter. Ich möchte Firebird aus dem Quelltext heraus verwenden.

Panthrax

kiar 19. Feb 2005 20:40

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
hallo ,

leider kenn ich mich mit zeos nicht aus, aber bei ibx ist es so, das du mit IBtransaction einen verbindung zur DB herstellt und diese wieder schliesst.

ergo solltest du bei den zeos suchen, welche komponenete für die transaction zuständig ist.

raik

Panthrax 19. Feb 2005 20:57

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
Ich habe mich auf der Seite, die du oben nanntest, umgesehen. Es gibt dort etwas, das kommt meinem Problem schon näher: Zeos Library (Einsatz mit Delphi und Firebird) Allerdings konnte es nicht weiterhelfen.

Dinge wie:
Delphi-Quellcode:
ZQuery1.Add('DISCONNECT ALL;');
ZConnection1.StartTransaction;
try
  ZQuery1.ExecSQL;
except
  ZConnection1.Rollback;
end;
ZConnection1.Commit;
scheitern daran, dass das Token (hier: DISCONNECT) unbekannt ist.

Es bleibt die Frage: Warum kennt Firebird seine eigenen SQL-Befehle nicht? Oder woran scheitert es?

Panthrax

kiar 19. Feb 2005 21:00

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
bist du sicher, das das ein befehl von firebird ist?

ol1uw 19. Feb 2005 21:05

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
Vielleicht hilft der Link etwas weiter
How to create a database, tables and triguers

kiar 19. Feb 2005 21:12

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
na das nenn ich mal ne antwort, da ist alles dabei :thumb:

gleich mal in die linkliste aufnehmen, falls ich mal mit den zeos arbeiten sollte

raik

Panthrax 19. Feb 2005 21:49

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
@kiar: Ich habe oben angegeben, das ich als Befehlsreferenz für SQL die Dokumentation von firebird.sourceforge.net, also von Projektseite selbst zugunde lege. Ich gehe davon aus, das sie in den Dokumenten zeigen, was funktioniert.

@ol1uw: Danke für den Hinweis. Aber die Seite kannte ich schon. Ich bin www.ZeosLib.net und firebird.sourceforge.net schon 'rauf und 'runter gesurft. - Auf der Seite wird u.a. erklärt, wie man eine Datenbank anlget (wie der Titel ja bereits sagt) und sich mit ihr verbindet, aber leider nicht, wie man die Verbindung wieder vollständig löst; also auch die Datenbank-Datei vom Datenbank-Server löst.

Panthrax

lume96 19. Feb 2005 22:01

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
Moin,

reicht Dir ein
Delphi-Quellcode:
ZConnection1.Disconnect;
nicht aus ?

Irgendwie verstehe ich das Problem nicht.

Tschüss,
Lutz

Panthrax 19. Feb 2005 22:29

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
Nein, leider scheint ein Disconnect nicht auszureichen.

Beispiel (Datenbankdatei: 'MyDB.fdb')
Delphi-Quellcode:
...
var
  Stream :TStream;
...
ZConnection1.Connect;
ZConnection1.Disconnect;
// Hier folgt die Exception:
Stream:=TFileStream.Create('MyDB.fdb',fmOpenRead,fmShareExclusive);
...
Exception:

Datei '...\MyDB.fdb' kann nicht geöffnet werden. Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.


Wie also kann ich die Verbindung zwischen Datei und Firebird lösen?

Panthrax

dizzy 19. Feb 2005 22:47

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
Unter Umständen könnte es schon reichen nach dem Schließen eine kurze Zeit zu warten. Ich kann mir vorstellen, dass die DB mit dem Schließen noch nicht fertig ist, wenn dein Programm aber schon Zugriff auf das File will. Klatsch da einfach mal ein Sleep(sec); zwischen. Evtl. tut's das schon.

Gruss,
Fabian

Panthrax 19. Feb 2005 22:53

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
Hab's mit einem Sleep probiert - funktioniert nicht. Auch nicht wenn ich das Programm anderweitig beschäftige. Letzteres hatte ich vorher schon probiert.

Panthrax.

lume96 20. Feb 2005 08:58

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
Zitat:

Zitat von Panthrax
Wie also kann ich die Verbindung zwischen Datei und Firebird lösen?

Moin,
ich behaupte mal weiterhin, dass ein einfaches Disconnect ausreicht.

Man kann sogar mehrere Zconnections innerhalb des gleichen Programms auf die gleiche DB zugreifen lassen.

Der von Dir beschriebene Fehler tritt auf, wenn ein anderer Prozess, sprich ein anderes Programm auf die DB Zugriff hat (Z.B. ein DB-Admin-Tool, die Delphi-IDE mittels einer Kompo die zur Design-time aktiv ist, etc...).

(Wenn ich jetzt irgendwelchen Unsinn rede, dann bitte ich um Korrektur)

Ausserdem, bist Du Dir sicher, dass der Fehler nach dem Disconnect auftritt, oder eher bei dem TFileStream.Create ???

Wie auch immer, ich hab Dein Beispiel kurz nachgebaut und habe keine Probleme / Fehler.

(Abgesehen davon, dass ich keinen Sinn darin sehen kann, die DB mittels FileStream.Create öffnen zu wollen).

Dein Problem muss eher an aderer Stelle liegen.

Tschüss,
Lutz

lume96 20. Feb 2005 13:22

Re: Fragen: FB SQL-Befehle, TZConnection, Datenbankdateizugr
 
Hi,

@Panthrax:
Hab Deine PN bekommen, hatte das Projekt leider nicht mehr.

Also schnell noch mal gebaut, und hop, gleiches PB wie Du.

Im Endeffekt scheint es wie folgt auszusehen :
Mit dem FileStream.Create läuft es nur, wenn die aktuelle Instanz des Programmes die DB nicht erstellt hat.

Hat die aktuelle Instanz des Progs die DB erstellt, hilft auch ein Disconnect nichts.

Ich hab noch schnell versucht, die ZConnection, die für das DB Create benutzt wird, dynamisch zu erstellen und hinterher wieder zu löschen. Ändert nichts.

Noch'n Bug der Zeos !!! ???

Tschüss,
Lutz

NB.: Ich frag mich langsam, ob man die Zeos benutzen sollte ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:05 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