Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#6

AW: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess

  Alt 14. Jul 2014, 18:10
Wenn Du zur Entwurfszeit eine Verbindung hergestellt (fbembed.dll) hast, musst Du diese Verbindung schließen, dann sollte es klappen.
Stimmt nicht: Ich habe eben genau das gemacht: Bei sämtlichen Queries im Datenmodul Active auf True gestellt, wobei die Connect-Komponente automatisch auf Connected = True steht. Dann die Embedded-Version gestartet und keinerlei Probleme festgestellt. Zuvor natürlich meine obligatorische Befehlszeile // IF ConMain.Connected THEN ConMain.Disconnect; auskommentiert. Dieses Problem bestand bei älteren Firebird-Embedded-Versionen, seit 2.0 ist das behoben.

Wenn Du dann noch für die Embedded Version Mehrbenutzerfähigkeit benötigst, muss die Datei firebird.conf den Eintrag RemoteFileOpenAbility = 1 erhalten.
Stimmt auch nicht: Ich habe eben genau das ausprobiert. Es kommt auf jeden Fall die besagte Fehlermeldung, völlig egal, welcher Wert in RemoteFileOpenAbility steht. oder ob ein Host, Server oder Port angegeben wurde – wenn ich gleichzeitig dieselbe DB in einem DB-Manager offen halte.

Ich empfehle daher ausdrücklich, auch Embedded-Versionen einer Firebird-Datenbankanwwendung erst als Server-Version zu entwickeln. Ich verwende zur Unterscheidung einfach die Startparameter. Solange ich mit der Embedded-Version arbeite, steht bei mir in den Startparametern 1 E:\Datenbanken\Win7\Firebird\ drin. Bei Programmstart werden die ausgelesen und ausgewertet: 1 heißt Server, 0 oder gar nichts heißt Embedded. Steht 0 zusammen mit einem Pfad, liegt die DB in diesem Pfad, fehlt der Pfad, liegt die DB im Anwendungsordner (nur für Stickware, da ab Vista für das Schreiben in Program Files Admin-Rechte benötigt werden).

Ergänzung:
Der Eintrag RemoteFileOpenAbility in der Datei firebird.conf hat nichts mit der Anzahl der Clients zu tun, die auf die Datenbank zugreifen dürfen, sondern ist ein Boolean, der, wenn gesetzt, festlegt, daß auf die Datenbank nur zugegriffen werden kann, wenn sie sich auf einem von einem physikalisch mit dem Computer, der die Client-Anwendung ausführt, verbundenen Laufwerk befindet.

Unless this configuration option is changed from 0 to 1, Firebird can open a database only if the database is stored on a drive physically attached to the local computer - the computer running that copy of Firebird. Requests for connections to databases stored on NFS mounted drives are redirected to a Firebird server running on the computer that "owns" the disk.

Des Rätsels Lösung liegt ganz woanders: Wenn man den Firebird-Server installiert hat und mit einem DB-Manager wie z.B. IbExpert die Datenbank öffnet, läuft sie im IbExpert über den Firebird-Server und wird von diesem geöffnet, also quasi "vereinnahmt". Versucht man nun, dieselbe Datei über die Embedded-DLL zu öffnen, wird das selbstverständlich verweigert, weil die Datenbank-Datei nur durch einen einzigen DB-Server – die Embedded-DLL stellt quasi einen eigenen Server dar – gleichzeitig geöffnet sein darf. Hat also nichts mit Multiuser-Fähigkeiten oder eingeschränkter Userzahl zu tun.

Was ich jetzt noch nicht ausprobiert habe: Die Embedded-DLL in den Programmordner des DB-Managers zu kopieren mitsamt aller benötigten Dateien. Ich laß das hier lieber sein, da ich zwar Embedded-DB-Anwendungen entwickle, jedoch nie an der Embedded-DB direkt, sondern wie oben bereits beschrieben stets die Server-Variante bevorzuge. Die Funktionalität ist fast dieselbe bis auf die Client-DLL.

Geändert von Perlsau (14. Jul 2014 um 18:37 Uhr) Grund: Ergänzung
  Mit Zitat antworten Zitat