Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi ile SQL server bağlantı hatası yakalama
#11
(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;
WWW
Cevapla
#12
@csunguray çok çok tşk ederim,

kopuk bağlantı algılarken bu örneklerden faydalanacağım.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi SLL kullanım sorunu Bay_Y 2 183 06-11-2025, Saat: 11:16
Son Yorum: Bay_Y
  Delphi İle Firebird 2.5x Uzaktan Yedekleme Aracı COMMANDX 1 233 25-10-2025, Saat: 22:19
Son Yorum: mcuyan
  TIdHTTPWebBrokerBridge ile HTTP server de response bloklanabilirmi? aegean 1 265 25-09-2025, Saat: 19:57
Son Yorum: aegean
  Delphi 13 Bellek Kullanım Sorununun Çözümü RAD Coder 4 613 16-09-2025, Saat: 07:06
Son Yorum: enigma
  Delphi Memo bilgileri MS-Word aktarmak Metin 2 583 03-08-2025, Saat: 17:33
Son Yorum: Metin



Konuyu Okuyanlar: 1 Ziyaretçi