Keine Verbindung Error Code erstellen.

Für Fragen von Einsteigern und Programmieranfängern...
Andy Nightingale
Beiträge: 413
Registriert: Mo 13. Jan 2025, 12:11

Keine Verbindung Error Code erstellen.

Beitrag von Andy Nightingale »

Hallo Leute,
ich habe eine Frage. Mein Programm verbindet sich mit dem Zeos ZConnection mit einer Datenbank im Internet. Wenn sich das Programm nicht verbinden kann dann kommt nach einer Weile ein Fehlercode mit unverständlichen Dingen drin...das möchte ich aber gerne abfangen. Also wenn sich das Programm nicht innerhalb von 5 Sekunden verbinden kann das dann ein eigenes Fenster sich öffnet mit meinen Meldungen drauf...oder das eine Message kommt mit einem Text....und im Hintergrund ein Abbruch kommt.-oder wo ein Button kommt...versuchen Sie es nochmal....wie ist da die Vorgehensweise?? Grüße

Soner
Beiträge: 796
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Keine Verbindung Error Code erstellen.

Beitrag von Soner »

Also wenn du nicht auf Ergebnis von ZConnection warten möchtest und nach bestimmte Zeit selber abbrechen möchtest, dann musst du Threads verwenden. Ein Benutzer, ich glaube Helios war das, hatte vor einigen Jahren Fragen mit Threads und Datenbankverbindungen und er hat gutes Beispiel gehabt, ich fand es sehr gut, wie er das gemacht hat, such mal danach.

Das mit dem Fehler kannst du abfangen z.B. etwa so:

Code: Alles auswählen

  try
    ZConnection1.Connected:=true;
  except
    on E: Exception do begin
      if Pos('password',E.Message)>0 then 
         ShowMessage('Sie haben falsches Passwort eingegeben!');
    end;
  end;
Du kannst auch für dich als Entwickler alle Exceptions loggen, um zu schauen wo Fehler auftreten.

Code: Alles auswählen

procedure TFormMain1.FormCreate(Sender: TObject);
begin
  // Alle Exceptions soll zentral abgefangen werden. 
  Application.OnException := @CustomExceptionHandler;
end;

procedure TFormMain1.CustomExceptionHandler(Sender: TObject; E: Exception);
var
   I: Integer;
   Frames: PPointer;
   Report: string;
begin
   if E <> nil then begin
     Report := 'Fehlerklasse: ' + E.ClassName + LineEnding +
              'Fehlernachricht: '+ LineEnding + E.Message + LineEnding;
   end;

   Report := 'Programmfehler! ' + LineEnding +
             Report + LineEnding + LineEnding +
             'Stacktrace:' + LineEnding +
             BackTraceStrFunc(ExceptAddr);
   Frames := ExceptFrames;
   for I := 0 to ExceptFrameCount - 1 do
     Report := Report + LineEnding + BackTraceStrFunc(Frames[I]);
   LogMessage(Report);
end;
Ich glaube, dass ich Exception-Teil von hier genommen habe.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7297
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Keine Verbindung Error Code erstellen.

Beitrag von af0815 »

Zu prüfen ob eine Verbindung zu einer DB aufgebaut werden kann, gehört IMHO zu keinen leichten Aufgaben. Auch nicht die gezielte Überwachung.

Wie willst du in 5 Sekunden das prüfen ? Aktuell schickt der Treiber TCP Pakete für die Verbindung raus und wartet ob es im Protokoll ein Timeout gibt. Das ist deine kryptische Meldung, die nach dem Ablaufen der Timeouts kommt.

Es gibt Ansätze wie man Annahmen treffen kann, ob der DB Server erreichbar ist. Das ist im allgemeinen Internet oft aber nicht sinnvoll (Bsp. Pings).

Ich weiß jetzt nicht ob bei ZEOS da etwas in der letzten Zeit geändert wurde, aber das Abfangen der Exception ist aktuell mir der einzig stabile Weg.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Andy Nightingale
Beiträge: 413
Registriert: Mo 13. Jan 2025, 12:11

Re: Keine Verbindung Error Code erstellen.

Beitrag von Andy Nightingale »

Soner hat geschrieben: Mi 6. Mai 2026, 22:45 Also wenn du nicht auf Ergebnis von ZConnection warten möchtest und nach bestimmte Zeit selber abbrechen möchtest, dann musst du Threads verwenden. Ein Benutzer, ich glaube Helios war das, hatte vor einigen Jahren Fragen mit Threads und Datenbankverbindungen und er hat gutes Beispiel gehabt, ich fand es sehr gut, wie er das gemacht hat, such mal danach.


Hallo Soner,

habe da ein paar Sachen getestet....es ging leider nicht. Ich schaue mir mal das Thread an. Doch komplizierter als gedacht. Danke dir.

Andy Nightingale
Beiträge: 413
Registriert: Mo 13. Jan 2025, 12:11

Re: Keine Verbindung Error Code erstellen.

Beitrag von Andy Nightingale »

af0815 hat geschrieben: Do 7. Mai 2026, 08:04 Zu prüfen ob eine Verbindung zu einer DB aufgebaut werden kann, gehört IMHO zu keinen leichten Aufgaben. Auch nicht die gezielte Überwachung.

Wie willst du in 5 Sekunden das prüfen ? Aktuell schickt der Treiber TCP Pakete für die Verbindung raus und wartet ob es im Protokoll ein Timeout gibt. Das ist deine kryptische Meldung, die nach dem Ablaufen der Timeouts kommt.

Es gibt Ansätze wie man Annahmen treffen kann, ob der DB Server erreichbar ist. Das ist im allgemeinen Internet oft aber nicht sinnvoll (Bsp. Pings).

Ich weiß jetzt nicht ob bei ZEOS da etwas in der letzten Zeit geändert wurde, aber das Abfangen der Exception ist aktuell mir der einzig stabile Weg.
Hallo af0815,
ok dann versuche ich mal mehr von den Exception herauszufinden. Danke dir für die Einschätzung.

Benutzeravatar
Zvoni
Beiträge: 665
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Keine Verbindung Error Code erstellen.

Beitrag von Zvoni »

af0815 hat geschrieben: Do 7. Mai 2026, 08:04 Zu prüfen ob eine Verbindung zu einer DB aufgebaut werden kann, gehört IMHO zu keinen leichten Aufgaben.
Yepp. Diese Frage stellt sich im Schnitt alle 4-5 Monate erneut.

@Andy
Im Prinzip ist es dasselbe wie bei einem Mobiltelefon:
Du willst wissen, ob dein Kumpel auf dessen Mobiltelefon erreichbar ist, oder ob er z.B. in einem Funkloch ist.

Die prinzipiell sicherste Variante das herauszufinden, ist aber halt tatsächlich anzurufen.

Auf dein Szenario übertragen:
die prinzipiell sicherste Variante herauszufinden, ob eine Datenbank/ein DB-Server, egal wo dieser sich befindet, erreichbar ist, ist tatsächlich zu versuchen eine Verbindung aufzubauen.
Muss natürlich in einen Try/Except-Block
TimeOuts und sonstige Faktoren müssen entsprechend berücksichtigt werden.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Andy Nightingale
Beiträge: 413
Registriert: Mo 13. Jan 2025, 12:11

Re: Keine Verbindung Error Code erstellen.

Beitrag von Andy Nightingale »

Zvoni hat geschrieben: Do 7. Mai 2026, 14:19
af0815 hat geschrieben: Do 7. Mai 2026, 08:04 Zu prüfen ob eine Verbindung zu einer DB aufgebaut werden kann, gehört IMHO zu keinen leichten Aufgaben.
Yepp. Diese Frage stellt sich im Schnitt alle 4-5 Monate erneut.
Hallo Zvoni,
hast du das schon einmal gemacht? Kannst du das? Grüße

Benutzeravatar
Zvoni
Beiträge: 665
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Keine Verbindung Error Code erstellen.

Beitrag von Zvoni »

Andy Nightingale hat geschrieben: Do 7. Mai 2026, 14:44
Zvoni hat geschrieben: Do 7. Mai 2026, 14:19
af0815 hat geschrieben: Do 7. Mai 2026, 08:04 Zu prüfen ob eine Verbindung zu einer DB aufgebaut werden kann, gehört IMHO zu keinen leichten Aufgaben.
Yepp. Diese Frage stellt sich im Schnitt alle 4-5 Monate erneut.
Hallo Zvoni,
hast du das schon einmal gemacht? Kannst du das? Grüße
Nein, musste ich noch nie machen.
Aber ich bin seit 20 Jahren Mitglied in diversen Foren, und diese Frage war damals schon ein Klassiker
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Andy Nightingale
Beiträge: 413
Registriert: Mo 13. Jan 2025, 12:11

Re: Keine Verbindung Error Code erstellen.

Beitrag von Andy Nightingale »

Zvoni hat geschrieben: Do 7. Mai 2026, 17:05
Andy Nightingale hat geschrieben: Do 7. Mai 2026, 14:44
Zvoni hat geschrieben: Do 7. Mai 2026, 14:19

Yepp. Diese Frage stellt sich im Schnitt alle 4-5 Monate erneut.
Hallo Zvoni,
hast du das schon einmal gemacht? Kannst du das? Grüße
Nein, musste ich noch nie machen.
Aber ich bin seit 20 Jahren Mitglied in diversen Foren, und diese Frage war damals schon ein Klassiker
Hi Zvoni,
leider gibt es kein Beispiel das ich gefunden habe...wenn das schon so lange ein Klassiker ist.-warum gibt es dann nicht einmal ein funktionierendes Beispiel? Echt schade

Soner
Beiträge: 796
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Keine Verbindung Error Code erstellen.

Beitrag von Soner »

Bei FireBird ist es leicht zu prüfen, ob der Server online ist:

Code: Alles auswählen

 if ZConnection1.Ping then begin 
   //anmelden
 end
 else ... //Server offline
Manchmal kann es passieren, dass die Verbindung unterbricht, deshalb sende ich immer von SQL-Abfragen ein Ping;

Code: Alles auswählen


function DbOnline: Boolean;
begin
  Result:=DBConn1.Ping and DBConn1.Connected;
  if Result then exit; //alles okay

 try
   DBConn1.Reconnect; //Reconnect funktioniert nicht immer
   Result:= true;
 except
   on E: Exception do begin
     try
      DBConn1.Disconnect; //ZEOS glaubt noch dass es eine Verbindung gibt deshalb richtig trennen.
     finally
     end;
     Result:= false;
   end;
 end;

 // Verbinden
 if Result=false then begin
   try
     DBConn1.Connected:=True;
     Result:= DBConn1.Connected;
   except
     on E: Exception do Result:= false;
   end;
 end;

 // Nachrichten neu registrieren
 if Result then begin
   try
    DbEventAlerter1.UnRegisterEvents; 
    DbEventAlerter1.RegisterEvents;
   except
     on E: Exception do  Result:= false;
   end;
 end;
end;

procedure MachWasMitDB;
begin
   if not DbOnline then exit;


   //mach mit DB etwas...
end;
Man kann bei Except-Abschnitt Fehlermeldungen ausgeben. Die Meldungen von DB-Server stecken bei E.Message als String.
Zuletzt geändert von Soner am Fr 8. Mai 2026, 16:10, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7297
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Keine Verbindung Error Code erstellen.

Beitrag von af0815 »

Andy Nightingale hat geschrieben: Mi 6. Mai 2026, 20:55 Hallo Leute,
ich habe eine Frage. Mein Programm verbindet sich mit dem Zeos ZConnection mit einer Datenbank im Internet. Wenn sich das Programm nicht verbinden kann dann kommt nach einer Weile ein Fehlercode mit unverständlichen Dingen drin...das möchte ich aber gerne abfangen.
Was für Verbindung - jeder Treiber funktioniert bei so speziellen Dingen anders. Wie Soner schreibt dürfte es bei FireBird gehen. Bei MSSQL geht der Connection.Ping nicht (zumindest solange ich das getestet habe, ist aber 3 Jahre her), weil es auch die FreeTDS Treiber nicht können.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 665
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Keine Verbindung Error Code erstellen.

Beitrag von Zvoni »

af0815 hat geschrieben: Do 7. Mai 2026, 21:55
Andy Nightingale hat geschrieben: Mi 6. Mai 2026, 20:55 Hallo Leute,
ich habe eine Frage. Mein Programm verbindet sich mit dem Zeos ZConnection mit einer Datenbank im Internet. Wenn sich das Programm nicht verbinden kann dann kommt nach einer Weile ein Fehlercode mit unverständlichen Dingen drin...das möchte ich aber gerne abfangen.
Was für Verbindung - jeder Treiber funktioniert bei so speziellen Dingen anders. Wie Soner schreibt dürfte es bei FireBird gehen. Bei MSSQL geht der Connection.Ping nicht (zumindest solange ich das getestet habe, ist aber 3 Jahre her), weil es auch die FreeTDS Treiber nicht können.
Und den Weg mit dem Ping haben wir ja auch schon tot diskuttiert :lol: :lol: :lol:
Kennst meine Meinung dazu
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7297
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Keine Verbindung Error Code erstellen.

Beitrag von af0815 »

Zvoni hat geschrieben: Fr 8. Mai 2026, 08:14 Und den Weg mit dem Ping haben wir ja auch schon tot diskuttiert :lol: :lol: :lol:
Kennst meine Meinung dazu
Connection.Ping und das (ICMP) Ping sind zwei verschiedene Sachen. Ichhabe gesehen das ZEOS vorbereitungen drinnen hat um ein "Ping" = Verbindungsüberprüfung über den Treiber macht (sofern vorhanden - meistens nicht). Das mit dem ICMP Ping kann man maximal bei Sachen einsetzen, wo man die ganze Kommunikation in der Hand hat. Maschinennetzwerke in der Produktion zum Beispiel. Weil dort kann man fixe Annahmen zum Kommunikationsweg und Server treffen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Soner
Beiträge: 796
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Keine Verbindung Error Code erstellen.

Beitrag von Soner »

Ping funktioniert wunderbar bei Firebird. Ich verwende immer noch FB 2.5.
Manchmal gehen Benutzer des Programms Kaffee trinken oder irgendwas anderes machen und das Betriebssystem geht in Energiesparmodus. Der Code, den ich in "function DbOnline: Boolean;" gepostet habe, bewirkt, dass die Benutzer von Verbindungsausfall nichts merken.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7297
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Keine Verbindung Error Code erstellen.

Beitrag von af0815 »

Döner, das glaube ich dir, FB hat ein paar nette Features.

Aber Andy hat noch nicht bekannt gegeben, welchen DB Server er erreichen will. Wobei ein DB Server direkt im I-Net, da stellen sich automatisch meine Nacken Haare auf.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten