Keine Verbindung Error Code erstellen.
-
Andy Nightingale
- Beiträge: 413
- Registriert: Mo 13. Jan 2025, 12:11
Keine Verbindung Error Code erstellen.
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
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: 797
- 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.
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:
Du kannst auch für dich als Entwickler alle Exceptions loggen, um zu schauen wo Fehler auftreten.
Ich glaube, dass ich Exception-Teil von hier genommen habe.
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;
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;
- 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.
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.
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.
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.
Hallo af0815,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.
ok dann versuche ich mal mehr von den Exception herauszufinden. Danke dir für die Einschätzung.
- 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.
Yepp. Diese Frage stellt sich im Schnitt alle 4-5 Monate erneut.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.
@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.
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.
Hallo Zvoni,
hast du das schon einmal gemacht? Kannst du das? Grüße
- 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.
Nein, musste ich noch nie machen.Andy Nightingale hat geschrieben: Do 7. Mai 2026, 14:44Hallo Zvoni,
hast du das schon einmal gemacht? Kannst du das? Grüße
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.
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.
Hi Zvoni,Zvoni hat geschrieben: Do 7. Mai 2026, 17:05Nein, musste ich noch nie machen.Andy Nightingale hat geschrieben: Do 7. Mai 2026, 14:44Hallo Zvoni,Zvoni hat geschrieben: Do 7. Mai 2026, 14:19
Yepp. Diese Frage stellt sich im Schnitt alle 4-5 Monate erneut.
hast du das schon einmal gemacht? Kannst du das? Grüße
Aber ich bin seit 20 Jahren Mitglied in diversen Foren, und diese Frage war damals schon ein Klassiker
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: 797
- 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.
Bei FireBird ist es leicht zu prüfen, ob der Server online ist:
Manchmal kann es passieren, dass die Verbindung unterbricht, deshalb sende ich immer von SQL-Abfragen ein Ping;
Man kann bei Except-Abschnitt Fehlermeldungen ausgeben. Die Meldungen von DB-Server stecken bei E.Message als String.
Code: Alles auswählen
if ZConnection1.Ping then begin
//anmelden
end
else ... //Server offline
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;
Zuletzt geändert von Soner am Fr 8. Mai 2026, 16:10, insgesamt 1-mal geändert.
- 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.
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.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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- 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.
Und den Weg mit dem Ping haben wir ja auch schon tot diskuttiertaf0815 hat geschrieben: Do 7. Mai 2026, 21:55Was 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.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.
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
- 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.
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.Zvoni hat geschrieben: Fr 8. Mai 2026, 08:14 Und den Weg mit dem Ping haben wir ja auch schon tot diskuttiert![]()
![]()
![]()
Kennst meine Meinung dazu
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
Soner
- Beiträge: 797
- 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.
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.
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.
- 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.
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.
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).