Autor Beitrag
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 28.06.02 21:06 
Hallo noch mal,

du kannst das ganze nicht zur Designzeit machen. Du musst zu Laufzeit ermitteln wo deine Datenbank liegt (aus der Ini-Datei) dann den Connection String erzeugen und deine Connection öffnen. Danach kannst du die Tabellen und Querys öffenen.
Verbindungen zur designzeit aufzubauen ist sowiso schlechter Stiel. Das solltest du höchstens mal machen um kurz was zu testen.

Das ganze könnte inetwa so aussehen:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, DDB, DTables, DMaster, inifiles;

type
  TDataModule2 = class(TDataModule)
    DMaster1: TDMaster;
    DTable1: TDTable;
    procedure DataModuleCreate(Sender: TObject);
  private
    DBIni : tIniFile;
  public
    { Public-Deklarationen }
  end;

var
  DataModule2: TDataModule2;

implementation

{$R *.DFM}

procedure TDataModule2.DataModuleCreate(Sender: TObject);
begin
  DBIni := tIniFile.Create(ExtractFilePath(ParamStr(0))+ 'Datenbank.ini');
  DMaster1.Connection := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=' +
                         DBIni.ReadString('Pfade', 'DBPath', ExtractFilePath(ParamStr(0))) +
                         'Kundendaten.mdb;Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=qx99;'+
                         'Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;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:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';
 DMaster1.Connected := TRUE;
 DTable1.Open;
end; // DataModule Create
[...]


Gruß
Klabautermann
m-werk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Fr 28.06.02 21:23 
So sieht jetzt mein code aus:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  DBIni := tIniFile.Create(ExtractFilePath(ParamStr(0))+ 'Arisys.ini');
  ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=' +
                          DBIni.ReadString('Pfade', 'DBPath', ExtractFilePath(ParamStr(0))) +
                         'Kundendaten.mdb;Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=qx99;'+ 
                         'Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;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:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';
ADOConnection1.Connected := TRUE;
  DM.ADOSHaupt.Open;


Muß ich jetzt in die connectionString im Objektinspektor noch was eintragen oder überhautp was drinnstehen haben?
Und was trage ich in die INI-Datei ein bzw. wie wird der Datenbankpfad eingetragen?

Wenn ich jetzt mein Programm Starte, kommt folgende Meldung:

Der Vorgang ist für ein geöffnetes Objekt nicht zugelassen.

Dann öffnet sich das Hauptformular aber es ist leer.

PS: In der INI habe ich nichts stehen!

_________________
Grüße, m-werk
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Sa 29.06.02 00:33 
Hallo,

Fangen wir mal von hinten an:
m-werk hat folgendes geschrieben:
Der Vorgang ist für ein geöffnetes Objekt nicht zugelassen.

Das liegt wahrscheinlich daran, das du im Objektinspector noch "Connected = TRUE" beim ADOConnection1-Object hast. Damit ist der Connection String quasi schreibgeschützt.

m-werk hat folgendes geschrieben:
Muß ich jetzt in die connectionString im Objektinspektor noch was eintragen oder überhautp was drinnstehen haben?


Nein, es ist völlig Egal was da drin steht, da du diesen ja zur Laufzeit überschreibst. Alles was du im Objektinspektor einstellst gild wenn dein Programm startet und nur so lange bis du es im Programm änderst. Grundsätzlich kannst du alles was du im Objektinspektor einstellen kannst auch zur Laufzeit über deinen Programmcode ändern.
Wenn das Objekt ADOConnection1 im Objektinspektor eine Eigenschaft ConnectionString besitzt dann kannst du diese in deinem Programm über ADOConnection1.ConnectionString ändern.

m-werk hat folgendes geschrieben:
Und was trage ich in die INI-Datei ein bzw. wie wird der Datenbankpfad eingetragen?

Wie in früheren Postings beschrieben musst du dein Setup Programm dazu bringen die INI-Datei anzulegen und in diese den Eintrag zu machen. Nur dein Setup Programm weiß wohin der Benutzer die Datenbank installiert. Wie das mit Inno-Setup funktioniert habe ich hier schon beschrieben und mit anderen Setup-Programmen kenne ich mich überhaupt nicht aus.

Gruß
Klabautermann
m-werk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Sa 29.06.02 21:51 
Hi, ich höre immer nur INNO-SETUP. Ich habe das Inno-Setup zwar auf meinem System, aber das ist für mich sehr schwierig, da ich gesehen habe, dass man das ganze Setup selbst kreieren muß. Oder täusche ich mich da?.

Wenn dass so sein sollte, kann mir mit Inno-Setup jemand helfen?

_________________
Grüße, m-werk
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: So 30.06.02 00:56 
Hallo,

m-werk hat folgendes geschrieben:
Hi, ich höre immer nur INNO-SETUP. Ich habe das Inno-Setup

ich verwende nun mal nur Inno-Setup, daher kann ich auch nur davon sprechen.


m-werk hat folgendes geschrieben:
zwar auf meinem System, aber das ist für mich sehr schwierig, da ich gesehen habe, dass man das ganze Setup selbst kreieren muß. Oder täusche ich mich da?.

Was verstehst du unter "das ganze Setup kreieren"?
Fakt ist, Inno-Setup arbeitet Script basiert. Du hast also einen Quelltext, des sehr an eine INI-Datei erinnert und kannst so dein Setupprogramm gestalten.
Ich kann nicht behaupten das die Scriptsprache besonders schwer ist und das Basissetup kannst du von einem Assistenten erstellen lassen, danach nimmst du nur noch die nötigen erweiterungen vor.
Wenn du auf dieses System umsteigen willst helfe ich dir gerne dabei aber das sollten wir dann lieber per Personal Message weiterführen, da es nicht ins Delphi-Forum gehört.

Gruß
Klabautermann
m-werk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: So 30.06.02 19:46 
Hi, das wäre sehr nett von dir, wenn du mir da weiterhelfen würdest. Wie meinst du das mit 'Personal Message'. Hätte nichts dagegen.

_________________
Grüße, m-werk
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: So 30.06.02 20:06 
Das erkläre ich dir in der pm die grade geschrieben habe ;).

Gruß
Klabautermann
m-werk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Di 09.07.02 16:53 
Hi, so leute, ich bitte jetzt um eure hilfe.

Ich kann einen Wert aus der Registry herauslesen.
Wie kann ich jetzt aber, den wert bzw. den Ordner in die Connection-String so inkludieren, dass mein programm auf die Datenbank zugreift?

ausblenden Quelltext
1:
2:
3:
4:
ADOConection.ConectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=' + 
  ExtractFilePath(Application.ExeName) + 
  'Datenbank\Kundendaten.mdb;Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=qx99;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;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:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False'; 
ADOConection.IsConnected := TRUE;


So sieht meine connection-String aus.

In der Registry habe ich unter \Software\Arius\Settings den String: DBPath, und darunter ist der aktuelle Path der Datenbank. Ich möchte dies jetzt in die ConnectionString einbauen, nur wie?

_________________
Grüße, m-werk
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Di 09.07.02 17:09 
Hallo,

setze einfach anstelle von ExtractFilePath(Application.ExeName) deinen aus der Regestry gelesenen String ein.

Gruß
Klabautermann
m-werk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Do 11.07.02 16:36 
Hi, und wie? Ich hab mir mal nen Code zusammengeschnipselt:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure ..............(Sender: TObject);
var
path: String;
begin
  REG := TRegistry.Create;
  try
    try
      REG.RootKey := HKEY_CURRENT_USER;
      if REG.OpenKey('\Software\Arius\Settings', True) then
      begin
        if REG.ValueExists('DBPath') then a:=StrToInt(REG.ReadString('DBPath'))
        else a := 0;
        REG.CloseKey;
      end;
    except
       a := 0;
    end;
          end;
        end;
      end;
end;


Kann ich so die registry auslesen?
(hab leider meine Beschreibung für die Registry verlooren!)

Was setzte ich dann anstelle von "ExtractFilePath(Application.ExeName)" ein?

Und muß ich den Registry-Code in die Gleiche Procedure wie die Connection-String setzen?

_________________
Grüße, m-werk
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 11.07.02 16:52 
Hallo,

m-werk hat folgendes geschrieben:
ausblenden Quelltext
1:
2:
3:
[...]
        if REG.ValueExists('DBPath') then a:=StrToInt(REG.ReadString('DBPath'))
[...]


Erkläre mir doch bitte mal diese Logik? Path ist ein Sting der so aussieht: 'C:\XXX\Datenbank\MyDate.mdb'. Was willst du da in eine Zahl umwandeln?

Der Connection String muss so aufgebaut werden:
ausblenden Quelltext
1:
2:
3:
ADOConection.ConectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=' + 
 REG.ReadString('DBPath') + 
 'Datenbank\Kundendaten.mdb;Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=qx99;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;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:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';


Natürlich mus das ganze drumherum bestehen bleiben.

Gruß
Klabautermann
m-werk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Do 11.07.02 16:59 
Hi, UPS, da hab ich mich vertan, ich hab diesen code aus meinem Programm wo ich es mit Zahlen brauche.

Ich hab jetzt folgenden Code drin:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TDM.DataModuleCreate(Sender: TObject);
var REG:TRegistry;
    a:string;
begin
REG:=Tregistry.create;
  try
    REG.RootKey := HKEY_CURRENT_USER;
    if REG.OpenKey('Software\Arius\SettingsDB', True) then
      begin
        a:=REG.ReadString('DBPath');
      end;
  finally
    REG.CloseKey;
    REG.Free;
    inherited;
  end;

  ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=' +
                          REG.ReadString('DBPath') + 'Kundendaten.mdb;Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=qx99;'+
                         'Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;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:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';
  ADOConnection1.Connected := TRUE;
  DM.ADOSHaupt.Open; DM.ADOSKinder.Open; DM.ADOSGeschaeft.Open; DM.ADOSFinanzierung.Open;
  DM.ADOSHaushalt.Open; DM.ADOSAnlageprofiel.Open; DM.ADOSEmpfehlung.Open; DM.ADODataSet1.Open;
  DM.ADODataSet2.Open;
end;


Wenn ich jetzt das Programm installiere, und ich die Datenbank auf 'E:\Datenbank\Kundenverwaltung.mdb' speichere und dann das Programm Starte, kommt folgende Meldung:

Datei 'C:\Dokumente und Einstellungen\Steinkellner\Desktop\Kundendaten.mdb' nicht gefunden.

Warum fragt mich jetzt das Programm danach?
Ich hab doch bei der connectionstring 'REG.Readstring('DBPath') eingegeben.
PS. Ich arbeite auf Windows XP, aber dass ist sicherlich nicht der grund!

_________________
Grüße, m-werk
m-werk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Sa 13.07.02 19:16 
Hi, hat niemand eine Idee, was da falsch sein kann (siehe beitrag oben)

_________________
Grüße, m-werk