AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Abgebrochene ADOConnection wiederherstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Abgebrochene ADOConnection wiederherstellen

Offene Frage von "Iwo Asnet"
Ein Thema von Nico B. · begonnen am 4. Jul 2012 · letzter Beitrag vom 5. Jul 2012
Antwort Antwort
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#1

Abgebrochene ADOConnection wiederherstellen

  Alt 4. Jul 2012, 08:06
Datenbank: MS Access • Version: 5? • Zugriff über: ADO
Hallo alle miteinander,

ich habe ein Problem mit einer ADOConnection und brauche eure Hilfe.

Ich habe eine Datenbankverbindung, die ab und an abbricht, weil mein Netzwerk zusammenbricht.
Nun habe ich schon verschiedene Möglichkeiten probiert, um die Verbindung nach dem Zusammenbruch wiederherzustellen.

Aktuell ist dies mein Quellcode zum Wiederaufbau der Verbindung:
Delphi-Quellcode:
//Globale Variable
var
  ADOC_CNC: TADOConnection;

//Funktion zum Test der Verbindung
function Test_CNCDB: boolean;
var
  slHilf: TStringList;
begin
  slHilf:=TStringList.Create;
  Result:=ADOC_CNC.Connected;
  try
    try
      if Result
        then
          ADOC_CNC.GetTableNames(slHilf);
    except
      Result:=false;
    end;
  finally
    slHilf.Free;
  end;
end;

//Funktion zum Herstellen der Verbindung
function Open_CNCDB: boolean;
begin
  Result:=true;
  try
    if Test_CNCDB
      then
        begin
          if Close_CNCDB
            then
              begin
                ADOC_CNC.ConnectionString:='...';
                ADOC_CNC.LoginPromt:=false;
              end
            else
              begin
                //Fehler beim Trennen der Verbindung
              end
        end
      else
        begin
          ADOC_CNC.ConnectionString:='...';
          ADOC_CNC.LoginPromt:=false;
        end;
    ADOC_CNC.Open;
  except
    Result:=false;
  end;
end;

//Funktion zum Trennen der Verbindung
function Close_CNCDB:boolean;
begin
  Result:=true;
  try
    ADOC_CNC.Close;
  except
    Result:=false;
  end;
end;

//Nun das Wiederherstellen der Verbindung im eigentlichen Programm
if not Test_CNCDB
  then
    begin
      Close_CNCDB;
      if Open_CNCDB
        then
          //Wiederaufbau der Verbindung erfolgreich
        else
          //Verbindung konnte nicht wieder hergestellt werden
    end;
Habt ihr ne Idee, warum der Wiederaufbau der Verbindung nie klappt?
Ich probiere seit Tagen an diesem Code rum und bekomme es einfach nicht hin.
Nico Bäger
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Abgebrochene ADOConnection wiederherstellen

  Alt 4. Jul 2012, 09:00
Frage: greifst du wirklich auf eine MS Access Datenbank über das Netzwerk (also eine MDB-Datei auf einem freigebenen Verzeichis) zu?
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#3

AW: Abgebrochene ADOConnection wiederherstellen

  Alt 4. Jul 2012, 09:33
Frage: greifst du wirklich auf eine MS Access Datenbank über das Netzwerk (also eine MDB-Datei auf einem freigebenen Verzeichis) zu?
Der Einwand ist berechtigt, beantwortet aber nicht die ursprüngliche Frage.

Ich mache es immer so:
Delphi-Quellcode:
Procedure DoDatabaseStuff;
  Procedure _InnerDoDatabaseStuff;
  Begin
    // Lesen, beschreiben whatever der DB.
  End;

Begin
  Try
    _InnerDoDatabaseStuff;
  Except
    Reconnect;
    _InnerDoDatabaseStuff;
  End
End;
Ich gehe davon aus, das die Verbindung ok ist ('happy path'). Wenn nicht, baue ich die Verbindung neu auf und versuche mein Glück nochmal.

Natürlich sollte man die Exception auswerten und nur bei Verbindungsproblemen neu verbinden, klar.

Bei Neuaufbau der Verbindung kann man
* Eine Meldung aufpoppen lassen
* Es mehrmals versuchen
* Durch eine eigene Exception den Programmfluss kontrolliert unterbrechen.
  Mit Zitat antworten Zitat
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#4

AW: Abgebrochene ADOConnection wiederherstellen

  Alt 4. Jul 2012, 09:50
Hallo ihr beiden,

also erst mal zu sx2008:
Ja, ich greife auf eine mdb-Datei auf einem freigegebenen Verzeichnis zu (Data Source=\\123.123.123.132\ordner\datenbank.mdb). Aber wo liegt hier das Problem?

@Furtbichler:
Ich denke, wie man nun mitbekommt, dass ein reconnect notwendig ist, ist in meinem Fall erstmal zweitrangig. Mich interessiert eher, wie man den reconnect richtig macht, denn meiner funktioniert irgendwie nicht.
Ich mache den reconnect folgendermaßen:
1. Testen, ob die Verbindung noch besteht (dazu nehme ich meine Funktion Test_CNCDB)
=> 2. wenn nicht, dann Verbindung trennen (dazu nehme ich meine Funktion Close_CNCDB)
und anschließend Verbindung neu aufbauen (dazu nehme ich meine Funktion Open_CNCDB)
Nico Bäger
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: Abgebrochene ADOConnection wiederherstellen

  Alt 4. Jul 2012, 09:58
1. Access über Netzlaufwerk: Schlecht, wegen Mehrbenutzerbetrieb usw. GANZ Schlect!
2. Wieso prüfen, ob die Verbindung besteht? Bau sie im Fehlerfall neu auf. Du könntest die Connection auch verwerfen und eine neue instantiieren.
Delphi-Quellcode:
MyADOConnection.Connected := False;
MyADOConnection.Connected := True;
Reicht doch, oder? Wenn das wider Erwarten nicht funktioniert, dann eben so:
Delphi-Quellcode:
MyADOConnection.Free;
MyADOConnection := TADOConnection.Create(Nil);
MyADOConnection.ConnectionString := MyConnectionString;
MyADOConnection.Connected := True;
Ich finde das simpel, viel simpler als deinen Ansatz.
  Mit Zitat antworten Zitat
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#6

AW: Abgebrochene ADOConnection wiederherstellen

  Alt 4. Jul 2012, 14:41
Da bin ich wieder.
Ich wollte soeben probieren, ob es so einfach geht.
Habe dazu ein Testprogramm geschrieben.
Über einen Button kann ich die Verbindung herstellen
und über einen zweiten Button kann ich die Verbindung trennen.
Mit dem dritten Button kann ich die Verbindung testen.

So weit so gut.

Nun stelle ich die Verbindung her. -> Klappt.
Anschließend teste ich den Verbindungszustand. -> Klappt.
Dann ziehe ich das Netzwerkkabel von meinem Rechner.
-> Nun dürfte die Verbindung nicht mehr bestehen.
Ich teste also wieder den Verbindungszustand. -> Ergebnis: Verbindung besteht.
Das kann aber nicht sein!!!

Den Test der Verbindung habe ich über 3 verschiedene Wege probiert:
1. Über die Eigenschaft Connected der ADOConnection
Delphi-Quellcode:
if ADOC_CNC.Connected
  then //Verbindung besteht
2. Über eine Abfrage des Tabellenkopfes
Delphi-Quellcode:
try
  ADOQ_CNC.GetTableNames(Hilfsstringliste);
except
  //Verbindung unterbrochen
end;
3. Über eine Abfrage des Tabelleninhalts

Alle 3 Möglichkeiten funktionieren wie bei einer bestehenden Datenbankverbindung.
Warum?
Beziehungsweise was viel wichtiger ist, wie kann ich die Verbindung besser testen?
Nico Bäger
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 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