![]() |
Datenbank: firebird • Version: 2.5 • Zugriff über: embedded (UIB)
Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess ...
Hallo,
Habe mir nun doch Firebird installiert, sowohl die Sever Version als auch die Embedded Version. Bei letzterer sagt mir die Dokumentation, das keine eigentliche Installation nötig ist, ich muss nur die Dateien aus dem Paket in mein Anwendungsverzeichnis kopieren. Einige Dateien, die in Unterordnern stecken, die aber laut Dokumentation ebensfalls benötigt werden, habe ich auch in das Anwendungsverzeichnis kopiert. Danach habe ich die Datei fbembed.dll sowohl in: -fbclient.dll -gds32.dll kopiert, so das ja nach Anforderung durch das DBMS die richtige DLL vorliegt. Nun habe ich mit den Zeos Komponenten eine Testanwendung gebaut und sogar die Datenbankverbindung geschafft. Aber die Datei kann dennoch nicht geöffnet werden. ich erhalte die Fehlermeldung: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird. < I/O error during CreateFile(open) Wie erreiche ich den Dateizugriff mit der Embedded Version von Firebird. Will mir die Geschichte mit den Zugriffsrechten gerne für später aufheben, jetzt besser erst mal exclusiven Zugriff auf meine Datenbank, die eh auf meinem lokalen Rechner gespeichert ist, auf den aus räumlichen Gründen eh nur ich zugreife. Benutzer-Rechtevergabe ist da gar nicht notwendig. Ich will nur mit meiner Testdatei rumspielen um erst mal das Zusammenspiel der Komponenten (UIB) kennen zu lernen. Da bin ich schon froh, überhaupt eine Verbindung zu meiner Datenbank aufbauen zu können. Für das Erlernen der Vergabe der Benutzerrechte brauche ich noch ein ganzes Stück länger. Hier mein Quellcode, der die vom Firebird Team empfohlenen UIB Komponenten verwendet. Mit Zeos habe ich die Datenbakverbindung noch nicht geschafft.
Delphi-Quellcode:
Wie erreiche ich den erfolgreichen Zugriff auf meine Datei und welche Seiten der Firebird Dokumentation muss ich mir zum besseren Verständnis anschauen. Ich könnte auch ein besser verständliches Demo gebrauchen. Gibt es sowas, vielleicht zuerst mal nur mit einer Datei oder mit einer Master Detail Beziehung zwischen nur 2 Dateien?interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ZSqlUpdate, DB, ExtCtrls, DBCtrls, Grids, DBGrids, ZDataset, ZConnection, ZAbstractRODataset, ZAbstractDataset, uib, uibdataset; type TForm1 = class(TForm) DBGrid1: TDBGrid; DBNavigator1: TDBNavigator; DataSource1: TDataSource; UIBConfig1: TUIBConfig; UIBServerInfo1: TUIBServerInfo; UIBDataSet1: TUIBDataSet; UIBDataBase1: TUIBDataBase; UIBScript1: TUIBScript; UIBTransaction1: TUIBTransaction; private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} end. //Hier noch die zugehörige .dfm Datei: object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 286 ClientWidth = 426 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object DBGrid1: TDBGrid Left = 88 Top = 136 Width = 320 Height = 120 DataSource = DataSource1 TabOrder = 0 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Name = 'Tahoma' TitleFont.Style = [] end object DBNavigator1: TDBNavigator Left = 168 Top = 105 Width = 240 Height = 25 DataSource = DataSource1 TabOrder = 1 end object DataSource1: TDataSource DataSet = UIBDataSet1 Left = 16 Top = 24 end object UIBConfig1: TUIBConfig UserName = 'sysdba' PassWord = 'masterkey' Host = 'localhost' LibraryName = 'gds32.dll' DatabaseName = '..\..\data\' Left = 16 Top = 64 end object UIBServerInfo1: TUIBServerInfo UserName = 'sysdba' PassWord = 'masterkey' Host = 'localhost' LibraryName = 'gds32.dll' Left = 16 Top = 104 end object UIBDataSet1: TUIBDataSet Left = 64 Top = 24 end object UIBDataBase1: TUIBDataBase Params.Strings = ( 'sql_dialect=3' 'lc_ctype=WIN1252' 'password=masterkey' 'user_name=sysdba' 'sql_role_name=2') DatabaseName = 'D:\Programme\Borland\BDS\4.0\Projects\Zeos\data\fbtest.fdb' CharacterSet = csWIN1252 UserName = 'sysdba' PassWord = 'masterkey' LibraryName = 'gds32.dll' Role = '2' Left = 64 Top = 64 end object UIBScript1: TUIBScript Database = UIBDataBase1 Left = 16 Top = 168 end object UIBTransaction1: TUIBTransaction DataBase = UIBDataBase1 Left = 16 Top = 208 end end |
AW: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess
Was passiert, wenn Du den Hostnamen weglässt? Übrigens sollst Du die Dateien aus den Unterordnern nicht ins Programmverzeichnis kopieren, sondern die Verzeichnisstruktur, so wie sie ist, Genaueres dazu findest Du in der README_EMBEDDED.txt (oder so ähnlich).
|
AW: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess
Zitat:
Zitat:
|
AW: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess
Zitat:
Bei der Embedded Version werden Username und Passwort benötigt, Server/Host und Port darf dagegen nichts enthalten. |
AW: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess
Deswegen schrieb ich ja Hostname, von User und Passwort hatte ich nichts gesagt.
|
AW: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess
Zitat:
Delphi-Quellcode:
auskommentiert. Dieses Problem bestand bei älteren Firebird-Embedded-Versionen, seit 2.0 ist das behoben.
// IF ConMain.Connected THEN ConMain.Disconnect;
Zitat:
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. |
AW: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess
Zitat:
Die Fehlermeldung lautet dann: Ich habe jetzt auch das Feld Hostname leer gemacht aber eine Komponente UIBServerInfo mit drin, bei der ich die Eigenschaft Protocol mit "proLocalHost" belegt habe. Das Problem mit der Zugriffssperre besteht weiter. Wie aber kann ich nun den Zugriff auf meine Datenbank erreichen? Ich habe die Datenbank tatsächlich mit IBExpert angelegt. Aber was kann ich jetzt tun, um die Datei zu entsperren? Zitat:
Zitat:
Meine Embedded Version liegt einmal im Ordner meines Delphi Projektes und noch einmal in D:\Programme\Borland\BDS\4.0\Projects\Firebird-Embedded\ Aber in einer Kommandozeile zuerst eine Ziffer???? Oder sieht die wirkliche Kommandozeile dafür anders aus? Wenn ja, wie? Dann übernehme ich nämlich diese Vorgehensweise. Habe jetzt bei den Komponenten UIBConfig, UIBDataBase und UIBServerInfo die Eigenschaft LibraryName, die vorher auf gds32.dll gesetzt war, auf den Pfad meiner fbclient.dll des Firebird Servers gesetzt und damit kann ich erst mal ohne die Fehlermeldung die Datenbank aufrufen, das heißt, meine Anwendung startet ohne die vorherige Fehlermeldung. Ich kann aber noch immer keine Daten in meine Tabelle eigeben. Was muß ich dazu noch machen? Wenn ich meine Anwendung aber außerhalb der IDE starte, bekomme ich die GUI nicht zu sehen, nach ca 60 Sekunden sagt mir Windows, das meine Anwendung einen Fehler verursacht hat und beendet werden muß. Ich muß sie dann im Taskmanager suchen und dort beenden. Im Taskmanager sehe ich meine Anwendung also. Außerdem hatte ich nach der SQL Anweisung: CREATE TABLE meinetabelle(feld1 char(12),feld2 BIGINT, feld3 char(10)); bei Start nach dem Anlegen der Tabelle, die mittlerweile angelegt ist, die Fehlermeldung, das die Tabelle bereits existiert. Nun weiß ich von MySql, das es da eine Klausel "IF NOT EXISTS" gibt (CREATE TABLE IF NOT EXISTS meinetabelle (Feld1 Typ,Feld2 Typ,...);. Die Klausel "IF NOT EXISTS" wird aber hier als Fehler angemeckert. Wie kann ich da das DB-System anweisen, die Tabelle nur dann zu erzeugen, wenn sie noch nicht existiert? Andernfalls soll besser ein SELECT * FROM meinetabelle erfolgen, damit ich meine Daten anzeigen kann. in Pseudocode ausgedrückt also das hier: if not(TableExists(MeineTabelle)) then Create Table MeineTabelle(...) else Select * from MeineTabelle Wie erreiche ich das mit dem hier vorliegenden SQL Dialekt, der das "IF NOT EXISTS" nicht zu kennen scheint? . |
AW: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess
Diese Fehlermeldung kann auftreten, wenn du dich mit 32-bit Embedded (deine Anwendung ist 32-bit oder?) verbinden möchtest und gleichzeitig eine Verbindung über einen regulären Firbird 64-bit Server besteht. 32/64-bit kann hier nicht gemischt werden.
|
AW: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess
Zitat:
Wenn Du im Programm mit dem selber Benutzer wie bei der Anlage arbeitest, kannst Du die Rechteverwaltung erst einmal vernachlässigen. Auch bei der embedded gibt es ein Rechtemanagement, die Benutzer haben nur kein Passwort ( wird sich aber mit der 3er ändern). Um zu sehen, ob eine Tabelle schon existiert, kannst du in den Systemtabellen nachschauen.
SQL-Code:
Für andere Datenbankenobjekte gibt es ein CREATE OR ALTER für Tabellen leider (noch?) nicht.
select * from Rdb$relations where upper(rdb$relation_name) = upper ( '<Tabellenname>');
|
AW: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess
Zitat:
Zitat:
Zitat:
![]() ![]() Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 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 by Thomas Breitkreuz