(02-11-2025, Saat: 19:04)Under Adlı Kullanıcıdan Alıntı: Merhabalar arkadaşlar;
Delphi 7 ile geliştirdiğim SERVER<>CLIENT yapıdaki uygulamam ağ hatası ile karşılaşınca Microsoft SQL server ile bağlantı koptuğu için doğal olarak hataya düşüyor.
Bazen network hataları, bazen ise kullanıcının bilgisayarı uyku moduna geçtiği için networkü kapatması nedeniyle bu hataları alıyorum.
Uygulamamda DataModule içinde bulunan ADOConnetion kullanıyorum ve tüm diğer ADO bileşenlerim bu ADOConnection üzerinden veritabanına bağlanıyor.
Hata sonrası kullanıcılar mecburen uygulamayı kapatıp açmak zorunda kalıyorlar.
Ben şunu yapmak istiyorum:
Bağlantı hatası durumunda ADOConnection bağlanmayı tekrar denesin, bağlanamıyorsa kullanıcıya bilgi versin.
en sağlıklı nasıl bir çözüm üretebiliriz?
bu konuda yarımcı olabilirseniz sevinirim, şimdiden teşekkürlerimle.
Buradaki çözümü inceleyebilirsiniz (StackOverflow'daki bir çözümü incelerken mutlaka sorunun ve cevapların altındaki yorumları da okuyun):
database - How to resume/retry a broken TADOConnection across the application? - Stack Overflow
Procedure TDM.GetCommandResult_Conn(CText:String;Connection : TAdoConnection);
var Ado_Ds_Tmp:TAdoCommand;
Begin
Ado_Ds_Tmp:=TAdoCommand.Create(self);
try
Ado_Ds_Tmp.Connection:=Connection;
Ado_Ds_Tmp.ParamCheck := False;
Ado_Ds_Tmp.CommandText:=CText;
try
Ado_Ds_Tmp.Execute;
except
DM.RaiseExceptionCreate('Error ! Command, ('+StrToList(CText, ' ')[0]+')');
end;
finally
Ado_Ds_Tmp.Destroy;
end;
end;
procedure TDM.ADOConnection1WillExecute(Connection: TADOConnection;
var CommandText: WideString; var CursorType: TCursorType;
var LockType: TADOLockType; var CommandType: TCommandType;
var ExecuteOptions: TExecuteOptions; var EventStatus: TEventStatus;
const Command: _Command; const Recordset: _Recordset);
var
ErrorLogFileName : string;
ErrorFile : TextFile;
ErrorData : string;
Msg : String;
begin
try
if (CommandText<>ConnectionTestString) then begin
DM.GetCommandResult_Conn(ConnectionTestString, Connection);
end;
except
try
try
Connection.Connected := False;
except
end;
try
Connection.ConnectionString := AdoConnectionString;
Connection.Mode:=cmShareDenyNone;
finally
try
Connection.Connected := True;
// If you wanna log for frequency
ErrorLogFileName := ChangeFileExt(Application.ExeName,'.error.log');
AssignFile(ErrorFile, ErrorLogFileName);
if FileExists(ErrorLogFileName) then
Append(ErrorFile)
else
Rewrite(ErrorFile);
try
ErrorData := Format('%s : %s : %s (%s / %s)',[DateTimeToStr(Now), 'Disconnected but we reconnect.', '', 'UserName : '+DBUser, 'Client : '+GetComputerNetName]);
WriteLn(ErrorFile,ErrorData);
finally
CloseFile(ErrorFile)
end;
except
DM.RaiseExceptionCreate('ReConnection Failed!');
end;
end;
except
end;
end;
end;
(02-11-2025, Saat: 19:04)Under Adlı Kullanıcıdan Alıntı: Merhabalar arkadaşlar;
Delphi 7 ile geliştirdiğim SERVER<>CLIENT yapıdaki uygulamam ağ hatası ile karşılaşınca Microsoft SQL server ile bağlantı koptuğu için doğal olarak hataya düşüyor.
Bazen network hataları, bazen ise kullanıcının bilgisayarı uyku moduna geçtiği için networkü kapatması nedeniyle bu hataları alıyorum.
Uygulamamda DataModule içinde bulunan ADOConnetion kullanıyorum ve tüm diğer ADO bileşenlerim bu ADOConnection üzerinden veritabanına bağlanıyor.
Hata sonrası kullanıcılar mecburen uygulamayı kapatıp açmak zorunda kalıyorlar.
Ben şunu yapmak istiyorum:
Bağlantı hatası durumunda ADOConnection bağlanmayı tekrar denesin, bağlanamıyorsa kullanıcıya bilgi versin.
en sağlıklı nasıl bir çözüm üretebiliriz?
bu konuda yarımcı olabilirseniz sevinirim, şimdiden teşekkürlerimle.
Bu çözüm de hatayı (exception'ı) nasıl yakalayacağınızı anlatıyor:
delphi - How can I detect that a TadoConnection lost the communication with the server? - Stack Overflow
(*
Source - https://stackoverflow.com/questions/2289...ect=1&lq=1
Posted by jachguate
Retrieved 11/4/2025, License - CC-BY-SA 4.0
*)
uses
ComObj;
procedure TForm2.ApplicationEvents1Exception(Sender: TObject; E: Exception);
var
EO: EOleException;
begin
if E is EOLEException then
begin
EO := EOleException(E);
//connection error (disconnected)
if EO.ErrorCode = E_FAIL then
begin
try
try
ADOConnection1.Close;
except
;
end;
ADOConnection1.Open;
ShowMessage('Database connection failed and re-established, please retry!');
except
on E:Exception do
ShowMessageFmt('Database connection failed permanently. '
+ 'Please, retry later'#13'Error message: %s', [E.Message]);
end;
end
else
ShowMessage(E.Message + ' ' + IntToStr(EO.ErrorCode));
end
else
ShowMessage(E.ClassName + #13 + E.Message);
end;

