Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess ... (https://www.delphipraxis.net/181084-der-prozess-kann-nicht-auf-die-datei-zugreifen-da-sie-von-einem-anderen-prozess.html)

delphifan2004 14. Jul 2014 16:26

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:

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
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?

DeddyH 14. Jul 2014 16:47

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).

delphifan2004 14. Jul 2014 18:29

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

Zitat von DeddyH (Beitrag 1265515)
Was passiert, wenn Du den Hostnamen weglässt?

Wenn ich Username und Passwort weglasse, erhalte ich Fehlermeldung: "Username und Passwort nicht definiert".

Zitat:

Zitat von DeddyH (Beitrag 1265515)
Ü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).

Ok, danke! Hab ich berichtigt.

pmoegenb 14. Jul 2014 18:40

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

Zitat von delphifan2004 (Beitrag 1265510)
Aber die Datei kann dennoch nicht geöffnet werden.
Wie erreiche ich den erfolgreichen Zugriff auf meine Datei

Wenn Du zur Entwurfszeit eine Verbindung hergestellt (fbembed.dll) hast, musst Du diese Verbindung schließen, dann sollte es klappen. Wenn Du dann noch für die Embedded Version Mehrbenutzerfähigkeit benötigst, muss die Datei firebird.conf den Eintrag RemoteFileOpenAbility = 1 erhalten.

Bei der Embedded Version werden Username und Passwort benötigt, Server/Host und Port darf dagegen nichts enthalten.

DeddyH 14. Jul 2014 18:51

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.

Perlsau 14. Jul 2014 19:10

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

Zitat von pmoegenb (Beitrag 1265534)
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
Delphi-Quellcode:
//  IF ConMain.Connected THEN ConMain.Disconnect;
auskommentiert. Dieses Problem bestand bei älteren Firebird-Embedded-Versionen, seit 2.0 ist das behoben.

Zitat:

Zitat von pmoegenb (Beitrag 1265534)
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.

delphifan2004 15. Jul 2014 06:59

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

Zitat von Perlsau
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.

Nun ja, ich verwende als Tabellenkomponente UIBDataSet und wenn ich das Projekt in Delphi lade, erhalte ich den Fehlerdialog, der auch erscheint, wenn ich ein Projekt lade, das eine in meinem Delphi nicht installierte Komponente voraussetzt.
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 von Perlsau
Ich empfehle daher ausdrücklich, auch Embedded-Versionen einer Firebird-Datenbankanwwendung erst als Server-Version zu entwickeln.

Gefällt mit überhupt nicht. Wollte mir mit der Embedded Version das Zugriffsrechtemenagement erst mal sparen. Wollte wie beim guten alten DBase die Datei anlegen, die Felder definieren und dann mit der Datei arbeiten. Schade, das das hier nicht so simpel ist.

Zitat:

Zitat von Perlsau
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).

Hmmm. Mein Firebird Server liegt in C:\Programme\Firebird\, von da an voreingestellte Pfade.

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?




.

tsteinmaurer 15. Jul 2014 07:52

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.

mkinzler 15. Jul 2014 08:46

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

Gefällt mit überhupt nicht. Wollte mir mit der Embedded Version das Zugriffsrechtemenagement erst mal sparen. Wollte wie beim guten alten DBase die Datei anlegen, die Felder definieren und dann mit der Datei arbeiten. Schade, das das hier nicht so simpel ist.
Da besteht kein Unterschied zwischen der Server und der embedded Version. Bei der embedded Version ist der Server nur in die (Client-)Dll eingebettet.
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:
select * from Rdb$relations where upper(rdb$relation_name) = upper ( '<Tabellenname>');
Für andere Datenbankenobjekte gibt es ein CREATE OR ALTER für Tabellen leider (noch?) nicht.

Perlsau 15. Jul 2014 08:54

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

Zitat von delphifan2004 (Beitrag 1265551)
Nun ja, ich verwende als Tabellenkomponente UIBDataSet und wenn ich das Projekt in Delphi lade, erhalte ich den Fehlerdialog, der auch erscheint, wenn ich ein Projekt lade, das eine in meinem Delphi nicht installierte Komponente voraussetzt.

Das hat aber weder was mit Firebird noch überhaupt mit Datenbanken zu tun, sondern betrifft deine Entwicklungsumgebung.

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
Die Fehlermeldung lautet dann:

Oh, eine geheime Fehlermeldung 8-)

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
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 Protokoll ist nicht der Host. Du würdest doch sicher auch nicht in ein Property-Feld, das die Breite deines Fensters beschreibt, den Text "Grün" hineinschreiben, oder?

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
Das Problem mit der Zugriffssperre besteht weiter.

Hast du meinen Beitrag überhaupt gelesen und verstanden? Hast du den Kommentar von Thomas Steinmaurer gelesen und verstanden?

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
Wie aber kann ich nun den Zugriff auf meine Datenbank erreichen?

Das steht in meinem Beitrag ausführlich beschrieben.

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
Ich habe die Datenbank tatsächlich mit IBExpert angelegt. Aber was kann ich jetzt tun, um die Datei zu entsperren?

Das steht in meinem Beitrag ausführlich beschrieben.

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
Zitat:

Zitat von Perlsau
Ich empfehle daher ausdrücklich, auch Embedded-Versionen einer Firebird-Datenbankanwwendung erst als Server-Version zu entwickeln.

Gefällt mit überhupt nicht. Wollte mir mit der Embedded Version das Zugriffsrechtemenagement erst mal sparen. Wollte wie beim guten alten DBase die Datei anlegen, die Felder definieren und dann mit der Datei arbeiten. Schade, das das hier nicht so simpel ist.

Wenn's dir nicht gefällt, läßt du's eben sein und beschäftigst dich mit etwas anderem ...

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
Zitat:

Zitat von Perlsau
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).

Hmmm. Mein Firebird Server liegt in C:\Programme\Firebird\, von da an voreingestellte Pfade.
Meine Embedded Version liegt einmal im Ordner meines Delphi Projektes und noch einmal in D:\Programme\Borland\BDS\4.0\Projects\Firebird-Embedded\

Wo dein Firebird-Server installiert wurde, ist erstmal nebensächlich. Die Datenbank-Dateien können sonstwo liegen. Auch der Speicherort deiner Embedded-Version ist nur wichtig für deine Anwendung, um die Datenbank-Datei zu finden.

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
Aber in einer Kommandozeile zuerst eine Ziffer????

Von einer Kommandozeile habe ich nichts geschrieben. Kennst du deine IDE überhaupt? Hast du schon einmal eine Anwendung mit Parametern gestartet? In deiner Delphi-Ide gibt es im Menü Start doch den Menüpunkt Parameter, nicht wahr? Und dort trägst du die gewünschten Parameter ein. Das hat denselben Effekt wie der Aufruf einer Exe-Datei mit Parametern, z.B. MeinProgramm.exe minimiert grün ... Was hast du gegen eine Ziffer am Anfang einzuwenden?

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
Oder sieht die wirkliche Kommandozeile dafür anders aus? Wenn ja, wie? Dann übernehme ich nämlich diese Vorgehensweise.

Keine Ahnung, was du mit "wirkliche Kommandozeile" meinst.

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
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?

Wie versuchst du denn Daten einzugeben? Ich kann dir hier doch nicht dein ganzes Programm schreiben ...

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
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.

Tja, ich fürchte, ohne auch nur eine Zeile Code kann man dir nicht wirklich weiterhelfen.

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
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.

Ja, wenn sie bereits existiert, kannst du sie nicht nochmal unter demselben Namen anlegen. Mir war gerade so, als ob du oben geschrieben hättest, du würdest deine Datenbank mit IbExpert anlegen und einrichten ...

Zitat:

Zitat von delphifan2004 (Beitrag 1265551)
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.

Wieso willst du denn die Tabelle bei jedem Start anlegen? Lege sie doch einmalig im IbExpert an und gut ist!

pmoegenb 15. Jul 2014 09:57

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

Zitat von Perlsau (Beitrag 1265537)
Zitat:

Zitat von pmoegenb (Beitrag 1265534)
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
Delphi-Quellcode:
//  IF ConMain.Connected THEN ConMain.Disconnect;
auskommentiert.

Ich meinte damit natürlich vor dem Kompilieren (Getestet mit der Komponente UniDAC).
Zitat:

Zitat von Perlsau (Beitrag 1265537)
Zitat:

Zitat von pmoegenb (Beitrag 1265534)
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.

Ich nehme Alles zurück, das habe ich mit der Verbindung zu einem Netzlaufwerk verwechselt.

Perlsau 15. Jul 2014 10:09

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

Zitat von pmoegenb (Beitrag 1265556)
Zitat:

Zitat von Perlsau (Beitrag 1265537)
Zitat:

Zitat von pmoegenb (Beitrag 1265534)
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
Delphi-Quellcode:
//  IF ConMain.Connected THEN ConMain.Disconnect;
auskommentiert.

Ich meinte damit natürlich vor dem Kompilieren (Getestet mit der Komponente UniDAC).

Das Problem des TE bestand aber nicht darin, zur Entwurfszeit keine Verbindung mit der Datenbankherstellen zu können:
Zitat:

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 sich nun herausgestellt hat, versuchte der TE, eine bereits bestehende Datenbank-Datei neu zu erstellen (CreateFile(open)). Da hapert's wohl auch an Grundlagen-Kenntnissen ... Irgendwelchen Code vom TE bekommen wir leider nicht zu sehen, so daß ihm nicht wirklich weitergeholfen werden kann :cry:

pmoegenb 15. Jul 2014 10:42

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

Zitat von Perlsau (Beitrag 1265559)
Das Problem des TE bestand aber nicht darin, zur Entwurfszeit keine Verbindung mit der Datenbankherstellen zu können.

Das habe ich schon richtig verstanden.
Wenn ich vor dem Kompilieren die zur Entwurfszeit aktivierte Verbindung nicht kappe, bekomme ich mit der ausführbaren Datei (.exe) keine Verbindung. Wird die Verbindung dagegen zuvor gekappt, klappst mit der ausführbaren Datei.

Perlsau 15. Jul 2014 11:13

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

Zitat von pmoegenb (Beitrag 1265561)
Wenn ich vor dem Kompilieren die zur Entwurfszeit aktivierte Verbindung nicht kappe, bekomme ich mit der ausführbaren Datei (.exe) keine Verbindung. Wird die Verbindung dagegen zuvor gekappt, klappst mit der ausführbaren Datei.

Das kann ich hier nicht nachvollziehen, wie ich bereits an dieser Stelle ausführlich beschrieben habe (ebenfalls DevArt-Komponenten: IbDac; wenn du UniDac einsetzt, setzt du im Prinzip denselben Provider ein wie ich). Mit anderen Worten: Ich kann hier die Embedded-Variante einer Datenbank-Datei mit einer im Debug-Modus innerhalb der IDE laufenden Client-Anwendung öffnen, auch wenn in der IDE die Datenbank mit der TibCConnection verbunden ist (Connected = true). Bei älteren Firebird-Embedded-Versionen (vor Version 2.0) wäre das nicht möglich gewesen, denn die Embedded-Variante gestattete damals keinen Multiuser-Zugriff. Wenn bei dir die Verbundung zur Laufzeit nicht hergestellt werden kann, während deine Connect-Komponente aktiv ist, hat das mit Sicherheit eine andere Ursache, wie unser Firebird-Evangelist bereits dargestellt hat.

tsteinmaurer 15. Jul 2014 12:33

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

Das habe ich schon richtig verstanden.
Wenn ich vor dem Kompilieren die zur Entwurfszeit aktivierte Verbindung nicht kappe, bekomme ich mit der ausführbaren Datei (.exe) keine Verbindung. Wird die Verbindung dagegen zuvor gekappt, klappst mit der ausführbaren Datei.
Die Delphi IDE wird vermutlich nicht die Embedded Library geladen haben, sondern eine normale Firebird Client-Library, die sich dann auf den lokal installierten regulären Firebird Server verbinden wird. Vermutlich halt ein 64-bit Firebird Server oder wenn 32-bit, dann in der SuperServer Architektur, welche keine Verbindungen von anderen Prozessen zulässt. Schau einfach mal mit z.b. ProcessExplorer nach, welche Library (gds32.dll, fbclient.dll) und von wo von der Delphi IDE geladen ist.

Perlsau 15. Jul 2014 12:59

AW: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess
 
Genau deshalb starte ich meine Firebird-DB-Clients, die einerseits die Server-Variante, andererseits aber auch die Embedded-Variante bedienen sollen, mit Startparametern. Daraus ergibt sich dann, welche Client-DLL geladen wird:
Delphi-Quellcode:
Function TDatMod.VerbindenDatenbank : Boolean;
begin
  Result := False;

  If ConMain.Connected Then ConMain.Disconnect;

  Case GL.DB_Modus Of

  0 : Begin // Embedded
        ConMain.ClientLibrary := GL.Pfad_Main + GL.ClientEName;
        ConMain.Server := '';
        ConMain.Port  := '';
      End;

  1 : Begin // Server Lokal
        ConMain.ClientLibrary := GL.Pfad_Main + GL.ClientName;
        ConMain.Server := 'LocalHost';
        ConMain.Port  := '3050';
      End;

  2 : Begin // Server Remote
        ConMain.ClientLibrary := GL.Pfad_Main + GL.ClientName;
        ConMain.Server := 'MyDBServer';
        ConMain.Port  := '3050';
      End;
  End;

  ConMain.Database               := GL.DB_Pfad + GL.DB_Name;
  ConMain.AutoCommit             := True;
  ConMain.LoginPrompt            := False;
  ConMain.Options.Charset        := 'UTF8';
  ConMain.Options.DefaultSortType := stCaseInsensitive;
  ConMain.Options.UseUnicode     := True;
  ConMain.SQLDialect             := 3;

  Try
    ConMain.Connect;
    Result := True;
  Except
    On e:exception DO GL.FehlerMeldung := 'Fehler beim Verbinden mit Datenbank: ' + e.Message;
  End;
end;
wobei
Delphi-Quellcode:
UNIT GlobalVars;

INTERFACE


...
    PUBLIC { Public-Deklarationen }
      Const
        ClientName     = 'fbclient.dll';
        ClientEName    = 'fbclientE.dll';
...
      Class Var
...
        DB_Modus       : Byte;
...
Aufgerufen wird das Ganze dann beim Programmstart:
Delphi-Quellcode:
Procedure TFormMain.FormActivate(Sender: TObject);
begin
  ...

  If Not DatMod.VerbindenDatenbank Then
  Begin
    ShowMessage(GL.FehlerMeldung);
    Close;
    Exit;
  End;

  ...
end;

delphifan2004 15. Jul 2014 14:39

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

Wie sich nun herausgestellt hat, versuchte der TE, eine bereits bestehende Datenbank-Datei neu zu erstellen (CreateFile(open)). Da hapert's wohl auch an Grundlagen-Kenntnissen ... Irgendwelchen Code vom TE bekommen wir leider nicht zu sehen, so daß ihm nicht wirklich weitergeholfen werden kann
Ich wollte keine Datenbank neu erstellen, die schon da ist, ich wollte die Tabellenstruktur erstellen. Nachdem das jedoch, sogar erfolgreich, ich bin stolz auf mich, gelungen ist, brauche ich eigentlich keine SQL Anweisung megr an dieser Stelle. Wenn dort aber keine steht, kommt die Fehlermeldung "SQL Anweisung ist leer" und ich kann mein Dataset nicht aktivieren (Active:= true). Wenn ich das im Objektinspektor einstellen will kommt besagte Fehlermeldung.
Deshalb und einzig und allein deshalb will ich dort eine möglichst allgemeingültige SQL Anweisung in DataSet.SQL stehen haben. Und nur deshalb suche ich nach der von mir genannten Möglichkeit.

Meine SQL Kenntnisse erwerbe ich gerade nach Prinzip Hello World Programm mit dem Buch MySQL 4 Espresso vom Franzis Verlag (Franzis Taschenbuch) Auflage von 2004, ISBN 3-7723-6445-4.
Sorry und nochmal Sorry und tausendfach Entschuldigung, das ich hier frage, andere tun das zwar um ihre Hausaufgaben im Informatikunterricht hier gemacht zu krigen und es findet sich dann immer ein Dummer, der Erklärungen gibt und sogar den ersehnten Quelltext postet. Aber ich muss hier die Hosenn runterlassen, weil ich dummerweise eben erst anfange, mich überhaupt mit Datenbanken zu beschäftigen. Ich kenne allerdings das alte DBase aus DOS Zeiten und habe damals auch Kommandodateien für diese Datenbank mit der eingebauten Programmiersprache geschrieben, aber Firebird ist damit nun mal absolut nicht zu vergleichen. Sorry und nochmals Sorry also, dafür das ich mich erst jetzt mit Firebird beschäftige. Die mitglieferten Dokus taugen bei diesem Kenntnisstand absolut gar nix für mich, ich brauch die Schritt für Schritt Anleitung wie damals als ich Pascal gelernt habe und vom Hello World Programm ausgehend meine Pascal Kenntnisse schrittweise Anweisung für Anweisung erworben habe. Warum gibt es diese Schritt
für Schritt Anleitungen nicht auch für all die andere Software????

Kann es wahrscheinlich nicht, weil die Hersteller der Software ihr Geld mit dem Support verdienen. Somit dürfen die gar nicht solche Dokus rausgeben, denn dann würde der Geld bringende Support nicht mehr benötigt. Warum also, wie in einem anderen Thread hier gefordert, für Firebird spenden?

Mit IBExpert kann ich grad mal die Datenbank erstellen, die die Tabellen aufnimmt. Den Feldeditor hatte ich schon mal aufgerufen, hab aber vergessen, wie. Deshalb die SQL Anweisung "CREATE TABLE ... ".

Stimmt also, die dumme Bemerkung mit den nicht vorhandenen Grundlagen. Wer natürlich auf Arbeit alles in einer Schulung vorgekaut kriegt, in der bezahlten Arbeitszeit, wie ich es mir in meinem stillen Kämmerlein nur erträumen kann, ist unfähig, die Mühe nachzuvollziehen, die ich hier zur Einarbeitung aufbringen muss. Ich sollte mich wirklich somit besser mit was anderem beschäftigen, besser das derzeit schöne sonnige Wetter draußen genießen.
Werd ich wohl nach diesem Post auch machen, bin nämlich arbeitslos!

Andererseits könnte man natürlich bei adäquatem Support sich auch mal in Softwaretechnologien einarbeiten, wenn man schon einen PC hat, auf dem ein Entwicklungssystem wie Delphi installiert ist.

Ich benutze ein 32 Bit Windows XP Professional, nix 64 Bit. Meine CPU kann nur 32 Bit.

Ich habe keinen anderen Quelltext, als den, der am Anfang meines Threads gepostet ist. Konfig Dateien in Firebird habe ich unverändert gelassen. Alle Einstellungen habe ich ausschließlich im Objektinspektor vorgenommen.

Ich weiß nicht mehr weiter. Ich hab die Datenbank jetzt, die Tabelle steht auch, ich kann aber keine Daten in mein DBGrid eingeben. Und der Start der DB Anwendung funktioniert nur innerhalb der IDE, warum nicht auch außerhalb?


Zitat:

Hast du meinen Beitrag überhaupt gelesen und verstanden? Hast du den Kommentar von Thomas Steinmaurer gelesen und verstanden?
gelesen JAAAA, verstanden noch nicht wirklich. Brauche das einfacher eklärt!

Zitat:

Ja, wenn sie bereits existiert, kannst du sie nicht nochmal unter demselben Namen anlegen. Mir war gerade so, als ob du oben geschrieben hättest, du würdest deine Datenbank mit IbExpert anlegen und einrichten ...
Will ich auch nicht, aber mit IBExpert lege ich die Datenbank an. Bisher habe ich vom Ablauf so viel verstanden, das dies eine Datenbank ist, die alle Tabellen aufnimmt, alle Tabellen die ich später miteinander verknüfen muss/will. Sozusagen ist die Datenbank dann ein Container für die Tabellen. Früher in DBAse oder Paradox war die Tabelle oder die Gesamtheit der Tabellen die Datenbank mit den gewünschten Informationen. Der Container für die Tabellen war der Ordner in dem diese Tabellen abgelegt waren. Heute mit Firebird ist dieser Container nicht ein Ordner sondern eine Datei. Diese Datei nimmt dann die Tabellen mit ihren Datenfeldern auf. Warum sonst ist das Erstellen der Datenbank vom Erstellen der Tabelle(n) getrennt. Ich habe durchaus schon mit der Datenbankoberfläche aus Delphi gearbeitet. Dort erstelle ich die Tabellenstruktur und speichere diese in einem Ordner. So ist nach meinem Verständnis die Datenbank in Firebird das Äquivalent für den Ordner in welchem die Tabellen gespeichert sind.
Und da ich mit IBExpert noch unsicher in der Bedienung bin, habe ich als die Tabelle in meiner Datenbank noch nicht existiert hat, die SQL Anweisung zum Erzeugen der Tabelle geschrieben.

Mir ist durchaus bewusst, das ich diese Anweisung nun für diese Tabelle nicht mehr brauche und rausschmeißen kann. Aber leer darf das besagte SQL Feld auch nicht sein. So brauche ich jetzt eine Anweisung die dafür sorgt, das ich die Daten der Tabelle angezeigt kriege, im Zweifelsfall leere Spalten und ich will außerdem nun Daten eingeben können.

Ich will also die Tabelle nicht bei jedem Start anlegen, sondern nur falls sie noch nicht angelegt ist. Was ich suche, ist somit eine Prüfung, ob die Tabelle Schon angelegt ist. Wenn nicht, dann will ich sie anlegen, wenn erledigt, soll diese Anweisung übersprungen werden. Stattdessen soll dann die Anzeige der Daten vorbereitet werden und mir eine Möglichkeit eröffnet werden, nun meine Daten einzugeben.


Die Firebird Dokus sind zu knapp für mich. Ich brauch das detaillierter. Eben so wi eine Anleitung beginnend mit dem Hello World Programm, dann Schritt für Schritt weiter, jede einzelne Anweisung (SQL, Konfigparameter, ...).

p80286 15. Jul 2014 16:21

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

Zitat von delphifan2004 (Beitrag 1265581)
Ich wollte keine Datenbank neu erstellen, die schon da ist, ich wollte die Tabellenstruktur erstellen. Nachdem das jedoch, sogar erfolgreich, ich bin stolz auf mich, gelungen ist, brauche ich eigentlich keine SQL Anweisung megr an dieser Stelle. Wenn dort aber keine steht, kommt die Fehlermeldung "SQL Anweisung ist leer" und ich kann mein Dataset nicht aktivieren (Active:= true).

Ja was machst du da eigentlich?
Im allgemeinen wird eine Datenbank incl. der zugehörigen Tabellen einmal erstellt, und dann werden nur noch Daten hin und her geschaufelt.
(daß man manchmal doch noch eine weitere Tabelle oder ein paar weitere Felder benötigt, klammere ich mal aus)
Wenn als Meldung kommt "SQL Anweisung ist leer", dann gibt es irgendwo in Deinen DBKomponenten einen SQL-Text (ich hab keinen gesehen), der an die Datenbank gesendet wird. Warum, wieso und wann, das seh' ich nicht.

In meinen Programmen, gibt es nur eine Connection und eine query-Komponente. Dieser ganze DBGRid und Datasource-Klimbim ist meiner Meinung nach vollkommen überflüssig. und augenscheinlich entwickeln diese bei Dir ja auch ein reges Eigenleben.

Übrigens solltest du Dich von diesen Analogien Datei/Datenbank/DBase-Tabell/Datei.. schnellstens verabschieden. Fall Du wirklich eine Datei identifizieren kannst, die mit Deinen Daten zu tun hat, dann ist das schön, aber grundsätzlich ist eine Datenbank eine BlackBox, die nur über SQL-Befehle zugängig ist.
(Perlsau hat ja auch hireichend beschrieben, das seine Programme mit embedded und Server-Datenbanken umgehen können ohne neu geschrieben werden zu müssen. Und das ist eigentlich State of the Art)

Zitat:

Wer natürlich auf Arbeit alles in einer Schulung vorgekaut kriegt, in der bezahlten Arbeitszeit, wie ich es mir in meinem stillen Kämmerlein nur erträumen kann, ist unfähig, die Mühe nachzuvollziehen, die ich hier zur Einarbeitung aufbringen muss
Das kann ich gut nachvollziehen, da ich, wie viele andere auch, zu den Selbstkauern gehöre.
Und für den Einstig, der Dir als ex-DBase Benutzer nicht so schwer fallen dürfte, der Wikipedia Artikel.

Und wenn Du da Verständnisprobleme hast, dann kannst Du gerne hier fragen.

Gruß
K-H

pmoegenb 15. Jul 2014 17:05

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

Zitat von Perlsau (Beitrag 1265572)
Genau deshalb starte ich meine Firebird-DB-Clients, die einerseits die Server-Variante, andererseits aber auch die Embedded-Variante bedienen sollen, mit Startparametern.

Ich habe das über eine .ini-Datei gelöst mit nachfolgender Struktur, die im jeweiligen Programmverzeichnis liegt:
Delphi-Quellcode:
[Sicherheit]
Server=
Port=
LoginPrompt=False
Client=fbembed.dll
[Database]
RIS=D:\Delphi_Projekte\RIS_FB\RIS.FDB
RISH=D:\Delphi_Projekte\RIS_FB\RISH.FDB
Die .ini-Datei wird dann wie folgt ausgelesen:
Delphi-Quellcode:
     Ini := TIniFile.Create(HelpPfad+'\FB.INI');
     UniConnection1.Server  := Ini.ReadString('Sicherheit','Server', '');
     UniConnection1.Port    := Ini.ReadInteger('Sicherheit','Port', 0);
     UniConnection1.SpecificOptions.Values['ClientLibrary'] :=
     Ini.ReadString('Sicherheit','Client', 'fbembed.dll');
     UniConnection1.LoginPrompt := Ini.ReadBool('Sicherheit','LoginPrompt', False);
     UniConnection2.Server  := UniConnection1.Server;
     UniConnection2.Port := UniConnection1.Port;
     UniConnection2.SpecificOptions.Values['ClientLibrary'] :=
     UniConnection1.SpecificOptions.Values['ClientLibrary'];
     UniConnection2.LoginPrompt := UniConnection1.LoginPrompt;
     // Aktuelle Daten
     UniConnection1.Database :=
     Ini.ReadString('Database','RIS', 'RIS.FDB');
     // Historische Daten
     UniConnection2.Database :=
     Ini.ReadString('Database','RISH', 'RISH.FDB');

     // Existenz der Datenbanken prüfen
     if not FileExists(UniConnection1.Database) then
        begin
        Messagedlg('Datenbank '+UniConnection1.Database+
        ' nicht gefunden', mtError, [mbOK,mbHelp], 216);
        Application.Terminate;
        end;
     if not FileExists(UniConnection2.Database) then
        begin
        Messagedlg('Datenbank '+UniConnection2.Database+
        ' nicht gefunden', mtError, [mbOK, mbHelp], 216);
        Application.Terminate;
        end;

     try
     if not UniConnection1.Connected then UniConnection1.Open;
     except
     on Exception do
     begin
     Messagedlg('Verbindung zur aktuellen Datenbank fehlgeschlagen', mtError,
     [mbOK,mbHelp],25);
     Application.Terminate;
     end;
     end;

     try
     if not UniConnection2.Connected then UniConnection2.Open;
     except
     on Exception do
     begin
     Messagedlg('Verbindung zur historischen Datenbank fehlgeschlagen', mtError,
     [mbOK,mbHelp],25);
     Application.Terminate;
     end;
     end;
     Ini.Free;
     CFGIni.Free;

pmoegenb 15. Jul 2014 17:08

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

Zitat von tsteinmaurer (Beitrag 1265569)
Schau einfach mal mit z.b. ProcessExplorer nach, welche Library (gds32.dll, fbclient.dll) und von wo von der Delphi IDE geladen ist.

Danke, es waren tatsächlich 2 Prozesse mit fbclient.dll vorhanden.


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