Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbankverbindung zur Laufzeit erstellen (https://www.delphipraxis.net/50054-datenbankverbindung-zur-laufzeit-erstellen.html)

MCOP2001DE 20. Jul 2005 00:26

Datenbank: Access • Version: 2003 • Zugriff über: ADO/SQL

Datenbankverbindung zur Laufzeit erstellen
 
Hallo

Ich Habe folgendes Problem ich möchte einen Datenbankverbindung zur Laufzeit ändern können.
Das habe ich über den OpenDialog auch schon verwirklicht diese Daten werden in einer INI-Datei gespeichert.
Diese klappt auch aber das aufrufen der Verbindungsdaten beim Programmstart klappt nicht da ich immer die Fehlermeldeung
"Fehler bei der Authentifizierung" bekomme.
Wenn ich den ConnetionString mit einer Datenbankzuweisung belege bekomme ich die Meldung nicht!
Wenn ich aber die Datenbank verschiebe bekomme ich trotz richtigen Verbindungsstring in der Ini-Datei die meldung das die Datenbank nicht gefunden wurde.

der Aufruf für den Start des Programms sieht wie volkt aus:
Delphi-Quellcode:
{Starten des Datenbankverbindung}
procedure TFRM_Main.FormShow(Sender: TObject);
var ini: TIniFile;
Dir : String;
begin
   ini:=TIniFile.Create('Konfiguration.ini');
   try
   ini.ReadString('DB','Pfad',Dir);
   TAB_Daten.Connection.ConnectionString := Dir;
   finally
   ini.Free;
   end;
{öffnen der Datenbankverbindung und der Tabellen}
   Begin
     TAB_DATEN.Connection.Connected         := True;
     TAB_DATEN.TAB_Anlagen.Active           := True;
     TAB_Daten.TAB_Anlagentyp.Active        := True;
     TAB_Daten.TAB_A_Arbeiten.Active        := True;
     TAB_Daten.TAB_A_Stoerungen.Active      := True;
     TAB_Daten.TAB_Bahnhof.Active           := True;
     TAB_Daten.TAB_Erbauer.Active           := True;
     TAB_Daten.TAB_Halle.Active             := True;
     TAB_Daten.TAB_Hersteller.Active        := True;
     TAB_Daten.TAB_Ersatzteil.Active        := True;
     TAB_Daten.TAB_EAnlagentyp.Active       := True;
     TAB_Daten.TAB_Zuordnung.Active         := True;
     TAB_Daten.TAB_Materialanlagen.Active   := True;
     TAB_Daten.TAB_Materialanlagentyp.Active := True;
     TAB_Daten.TAB_MA_Arbeiten.Active       := True;
     TAB_Daten.TAB_MA_Stoerungen.Active     := True;
     TAB_Daten.TAB_Werk.Active              := True;
     end;
end;
{Ende}
Hat jemand ne Idee wo mein Fehler liegt?

MFG

MCOP2001DE

x000x 20. Jul 2005 01:02

Re: Datenbankverbindung zur Laufzeit erstellen
 
Moin moin,
also das kann auch nicht funkltionieren...
Delphi-Quellcode:
ini.readstring(..);
gibt dir einen String zurück, aber wo weist du den zu?
Die Variable "dir" ist bei dir gar nicht gefüllt.
Delphi-Quellcode:
dir := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False';
TAB_DATEN.Connection.ConnectionString := Format(dir,[ini.readstring('DB','Pfad','db1.mdb')]);
So würde es eher funktionieren, vorrausgesetzt im aktuellen Pfad befindet sich die db1.mdb

jensw_2000 20. Jul 2005 06:08

Re: Datenbankverbindung zur Laufzeit erstellen
 
Ich mach es einfach mal so, dann spare ich mir etwas Getippe :mrgreen:

http://www.delphipraxis.net/internal...nnectionstring

Schöne Grüße,
Jens

:hi:

TeronG 20. Jul 2005 07:58

Re: Datenbankverbindung zur Laufzeit erstellen
 
evtl. nur n Dreher drinnen und sollte so aussehen ??? :gruebel:
Delphi-Quellcode:
try
ini.ReadString('DB','Pfad',Dir);       // <-- Vorher
dir := ini.ReadString('DB','Pfad',''); // <-- Nachher

MCOP2001DE 21. Jul 2005 22:27

Re: Datenbankverbindung zur Laufzeit erstellen
 
Hallo x000x

Zu deiner Frage

Zitat:

gibt dir einen String zurück, aber wo weist du den zu?
Die Variable "dir" ist bei dir gar nicht gefüllt.
Delphi-Quellcode:
dir := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False';
TAB_DATEN.Connection.ConnectionString := Format(dir,[ini.readstring('DB','Pfad','db1.mdb')]);
So würde es eher funktionieren, vorrausgesetzt im aktuellen Pfad befindet sich die db1.mdb
Der komplette String wird in die Ini Datei geschrieben und zwar so

Delphi-Quellcode:
{ändern der Datenbankverbindung}
procedure TFRM_Main.Verbindungndern1Click(Sender: TObject);
var ini : TIniFile;
Dir : String;
begin
{schliessen aller Datenverbindungen}
     TAB_DATEN.Connection.Connected         := False;
     TAB_DATEN.TAB_Anlagen.Active           := False;
     TAB_Daten.TAB_Anlagentyp.Active        := False;
     TAB_Daten.TAB_A_Arbeiten.Active        := False;
     TAB_Daten.TAB_A_Stoerungen.Active      := False;
     TAB_Daten.TAB_Bahnhof.Active           := False;
     TAB_Daten.TAB_Erbauer.Active           := False;
     TAB_Daten.TAB_Halle.Active             := False;
     TAB_Daten.TAB_Hersteller.Active        := False;
     TAB_Daten.TAB_Ersatzteil.Active        := False;
     TAB_Daten.TAB_EAnlagentyp.Active       := False;
     TAB_Daten.TAB_Zuordnung.Active         := False;
     TAB_Daten.TAB_Materialanlagen.Active   := False;
     TAB_Daten.TAB_Materialanlagentyp.Active := False;
     TAB_Daten.TAB_MA_Arbeiten.Active       := False;
     TAB_Daten.TAB_MA_Stoerungen.Active     := False;
     TAB_Daten.TAB_Werk.Active              := False;
{auswählen der neuen Datenquelle und speichern dieser}
   if openDialog.Execute then
    Dir := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+openDialog.FileName +';Persist Security Info=False' ;
    begin
     ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'Konfiguration.ini');
     ini.WriteString('DB', 'Pfad', Dir);
     ini.Free;
    end;
{auslesen der neuen Datenverbindung und eintragen der Werte in den ConnectionString}
    Begin
   ini:=TIniFile.Create('Konfiguration.ini');
    try
     ini.ReadString('DB','Pfad',Dir);
     TAB_Daten.Connection.ConnectionString := Dir;
    finally
     ini.Free;
    end;
{öffnen der Datenbankverbindung und der Tabellen}
     TAB_DATEN.Connection.Connected         := True;
     TAB_DATEN.TAB_Anlagen.Active           := True;
     TAB_Daten.TAB_Anlagentyp.Active        := True;
     TAB_Daten.TAB_A_Arbeiten.Active        := True;
     TAB_Daten.TAB_A_Stoerungen.Active      := True;
     TAB_Daten.TAB_Bahnhof.Active           := True;
     TAB_Daten.TAB_Erbauer.Active           := True;
     TAB_Daten.TAB_Halle.Active             := True;
     TAB_Daten.TAB_Hersteller.Active        := True;
     TAB_Daten.TAB_Ersatzteil.Active        := True;
     TAB_Daten.TAB_EAnlagentyp.Active       := True;
     TAB_Daten.TAB_Zuordnung.Active         := True;
     TAB_Daten.TAB_Materialanlagen.Active   := True;
     TAB_Daten.TAB_Materialanlagentyp.Active := True;
     TAB_Daten.TAB_MA_Arbeiten.Active       := True;
     TAB_Daten.TAB_MA_Stoerungen.Active     := True;
     TAB_Daten.TAB_Werk.Active              := True;

 end;
end;
{Ende}
Ich brauche also eigentlich nur den String aus der INI Datei lesen und in den ConnectinString einfügen.
Und das klappt irgentwie nicht.

TeronG ich habe deinen Code mal versucht mit dem selben Ergebnis "Fehler bei der Authentifizierung"

Hat noch jemand ne Idee??

MCop2001DE

jensw_2000 22. Jul 2005 00:23

Re: Datenbankverbindung zur Laufzeit erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habs :mrgreen:

Hier ist dein Fehler

Delphi-Quellcode:
ini.ReadString('DB','Pfad',Dir);
So muss es aussehen
Delphi-Quellcode:
Dir:=ini.ReadString('DB','Pfad','');
"Dir" war bei Dir :mrgreen: immer ''

Wenn die in "dir" angegebene DB nicht existiert kommt der beschriebene Fehler.

Jetzt wäre es natürlich elegant, wenn du nur Opendialog.filename in die ini schreibst anstatt des ConnectionString-Geraffels. Bei Jet Datenbanken reicht das auch völlig aus ...

So hättest du eine Möglichkeit die Konfig-Einstellungen sauber zu prüfen

Delphi-Quellcode:
    if Fileexists(dir) then
    begin
      AdoConn.ConnectionString := Dir;
      AdoConn.Connected := True
    end
    else begin
      Showmessage('Konfigurationen.ini oder DB wurde nicht gefunden. Wählen Sie eine DB');
      //hier Opendialog und neue DB wählen ...
    end;

Habe dir mein "Spielprojekt" mal angehängt


Schöne Grüße,
Jens
:hi:

jensw_2000 22. Jul 2005 00:29

Re: Datenbankverbindung zur Laufzeit erstellen
 
Das hier kannst du dir übrigens Sparen.

Delphi-Quellcode:
     TAB_DATEN.TAB_Anlagen.Active           := False;
     TAB_Daten.TAB_Anlagentyp.Active        := False;
     TAB_Daten.TAB_A_Arbeiten.Active        := False;
     TAB_Daten.TAB_A_Stoerungen.Active      := False;
     TAB_Daten.TAB_Bahnhof.Active           := False;
     TAB_Daten.TAB_Erbauer.Active           := False;
     TAB_Daten.TAB_Halle.Active             := False;
     TAB_Daten.TAB_Hersteller.Active        := False;
     TAB_Daten.TAB_Ersatzteil.Active        := False;
     TAB_Daten.TAB_EAnlagentyp.Active       := False;
     TAB_Daten.TAB_Zuordnung.Active         := False;
     TAB_Daten.TAB_Materialanlagen.Active   := False;
     TAB_Daten.TAB_Materialanlagentyp.Active := False;
     TAB_Daten.TAB_MA_Arbeiten.Active       := False;
     TAB_Daten.TAB_MA_Stoerungen.Active     := False;
     TAB_Daten.TAB_Werk.Active              := False;
Wenn die AdoConn geschlossen wird, werden die angebundenen DataSets automatisch geschlossen.

MCOP2001DE 1. Aug 2005 21:56

Re: Datenbankverbindung zur Laufzeit erstellen
 
Hallo Jensw_2000

Danke für den Tip hat geklappt :lol:

MCOP2001DE


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 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-2025 by Thomas Breitkreuz