Manfred Polak
2017-10-06 00:55:41 UTC
Moin!
In meiner kleinen Datenbankanwendung mit ADO ist bisher der Pfad zu
den Daten fest verdrahtet. Jetzt will ich das portabel machen, und zwar
soll die Datenbank gefunden werden, wenn sie im selben (beliebigen)
Verzeichnis wie das Programm ist. Meine Idee dazu war, den Connection
String mit Hilfe von ExtractFilePath(ParamStr(0)) zu modifizieren, und
das hab ich so auch als Beispiel in einem Buch gefunden. Für meine
Verhältnisse angepasst, sieht das Beispiel so aus:
procedure TForm1.FormCreate(Sender: TObject);
var pfad: string;
begin
pfad := ExtractFilePath(ParamStr(0));
DataModule2.ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'
+ 'Data Source=' + pfad + 'KnLL.mdb;Mode=Share Deny None;Jet OLEDB:System database="";'
+ 'Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="lockit";Jet OLEDB:Engine Type=4;'
+ 'Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;'
+ 'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";'
+ 'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;'
+ 'Jet OLEDB:Dont Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;'
+ 'Jet OLEDB:SFP=False;';
end;
Aber da bekomme ich eine Zugriffsverletzung. Wobei in dem Beispiel
im Buch alle ADO-Komponenten in Form1 liegen, bei mir dagegen sind
sie in einem Datenmodul, und in Form1 nur zwei DBGrids. Da hatte ich
natürlich die Idee, das mit TDataModule2.DataModuleCreate statt
TForm1.FormCreate zu machen, doch da bekam ich den Fehler "Der
Vorgang ist für ein geöffnetes Objekt nicht zugelassen". Heißt das, dass
die Bestandteile eines Datenmoduls vor diesem selbst erzeugt werden?
Ich hatte dann versucht, das so zu lösen:
procedure TDataModule2.DataModuleCreate(Sender: TObject);
var pfad: string;
begin
pfad := ExtractFilePath(ParamStr(0));
DataModule2.ADOConnection1.Close;
DataModule2.ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'
+ 'Data Source=' + pfad + 'KnLL.mdb;Mode=Share Deny None;Jet OLEDB:System database="";'
+ 'Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="lockit";Jet OLEDB:Engine Type=4;'
+ 'Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;'
+ 'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";'
+ 'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;'
+ 'Jet OLEDB:Dont Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;'
+ 'Jet OLEDB:SFP=False;';
DataModule2.ADOConnection1.Open;
end;
Doch da kam dann der Fehler "Could not find installable ISAM". Ich hab
noch zwei oder drei leicht geänderte Varianten probiert, aber immer kam
irgendeine Exception. Aber irgendwie muss das doch gehen, oder nicht?
Manfred
In meiner kleinen Datenbankanwendung mit ADO ist bisher der Pfad zu
den Daten fest verdrahtet. Jetzt will ich das portabel machen, und zwar
soll die Datenbank gefunden werden, wenn sie im selben (beliebigen)
Verzeichnis wie das Programm ist. Meine Idee dazu war, den Connection
String mit Hilfe von ExtractFilePath(ParamStr(0)) zu modifizieren, und
das hab ich so auch als Beispiel in einem Buch gefunden. Für meine
Verhältnisse angepasst, sieht das Beispiel so aus:
procedure TForm1.FormCreate(Sender: TObject);
var pfad: string;
begin
pfad := ExtractFilePath(ParamStr(0));
DataModule2.ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'
+ 'Data Source=' + pfad + 'KnLL.mdb;Mode=Share Deny None;Jet OLEDB:System database="";'
+ 'Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="lockit";Jet OLEDB:Engine Type=4;'
+ 'Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;'
+ 'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";'
+ 'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;'
+ 'Jet OLEDB:Dont Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;'
+ 'Jet OLEDB:SFP=False;';
end;
Aber da bekomme ich eine Zugriffsverletzung. Wobei in dem Beispiel
im Buch alle ADO-Komponenten in Form1 liegen, bei mir dagegen sind
sie in einem Datenmodul, und in Form1 nur zwei DBGrids. Da hatte ich
natürlich die Idee, das mit TDataModule2.DataModuleCreate statt
TForm1.FormCreate zu machen, doch da bekam ich den Fehler "Der
Vorgang ist für ein geöffnetes Objekt nicht zugelassen". Heißt das, dass
die Bestandteile eines Datenmoduls vor diesem selbst erzeugt werden?
Ich hatte dann versucht, das so zu lösen:
procedure TDataModule2.DataModuleCreate(Sender: TObject);
var pfad: string;
begin
pfad := ExtractFilePath(ParamStr(0));
DataModule2.ADOConnection1.Close;
DataModule2.ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'
+ 'Data Source=' + pfad + 'KnLL.mdb;Mode=Share Deny None;Jet OLEDB:System database="";'
+ 'Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="lockit";Jet OLEDB:Engine Type=4;'
+ 'Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;'
+ 'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";'
+ 'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;'
+ 'Jet OLEDB:Dont Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;'
+ 'Jet OLEDB:SFP=False;';
DataModule2.ADOConnection1.Open;
end;
Doch da kam dann der Fehler "Could not find installable ISAM". Ich hab
noch zwei oder drei leicht geänderte Varianten probiert, aber immer kam
irgendeine Exception. Aber irgendwie muss das doch gehen, oder nicht?
Manfred