Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi ile SQL server bağlantı hatası yakalama
#1
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.
Cevapla
#2
Merhabalar.
Bu tarz bir durumda aklıma ilk gelen şey TTimer ile bağlantıyı kontrol etmek.

procedure TDM.DataModuleCreate(Sender: TObject);
begin
 Timer1.Interval := 10000; // 10 saniyede bir kontrol
 Timer1.Enabled := True;
end;

procedure TDM.Timer1Timer(Sender: TObject);
var
 TestQuery: TADOQuery;
begin
 Timer1.Enabled := False; // Çakışma olmasın
 try
   // Bağlantı test et
   if not ADOConnection1.Connected then
   begin
     // Bağlantı kapalı, yeniden aç
     try
       ADOConnection1.Connected := True;
       ShowMessage('Bağlantı yeniden kuruldu.');
     except
       ShowMessage('Bağlantı kurulamıyor! Ağınızı kontrol edin.');
     end;
   end
   else
   begin
     // Bağlantı açık ama gerçekten çalışıyor mu test et
     TestQuery := TADOQuery.Create(nil);
     try
       TestQuery.Connection := ADOConnection1;
       TestQuery.SQL.Text := 'SELECT 1';
       try
         TestQuery.Open;
         TestQuery.Close;
         // Bağlantı OK
       except
         // Bağlantı ölü, yeniden kur
         ADOConnection1.Connected := False;
         Sleep(1000);
         ADOConnection1.Connected := True;
         ShowMessage('Bağlantı yeniden kuruldu.');
       end;
     finally
       TestQuery.Free;
     end;
   end;
 finally
   Timer1.Enabled := True;
 end;
end;

→ DataModule'e bir TTimer ekleyin (Timer1).
→ Timer1'in OnTimer event'ine yukarıdaki kodu yazın.
→ DataModuleCreate'e başlangıç kodunu ekleyin.

Bu sayede her 10 saniyede bir bağlantı kontrol edilir ve kopuksa otomatik yeniden bağlanır.

CPU tarafında çok minimal bir yük oluşur ki sistem bunu farketmeyecektir. Performans olarakta bir sorun yaşatacağını düşünmüyorum.
Cevapla
#3
cevabınız için tşk ederim,
hatırladığım kadarıyla uygulama açık iken bağlantı koparsa ado bunu algılayamıyor,
yani sizin
"if not ADOConnection1.Connected then" ifadesi çalışmıyor,

yine de deneyeceğim.
Cevapla
#4
(03-11-2025, Saat: 10:33)Under Adlı Kullanıcıdan Alıntı: cevabınız için tşk ederim,
hatırladığım kadarıyla uygulama açık iken bağlantı koparsa ado bunu algılayamıyor,
yani sizin
"if not ADOConnection1.Connected then" ifadesi çalışmıyor,

yine de deneyeceğim.

Evet haklısınız. Bu seferde yine TTimer kullanarak bir sorgu ile kontrol edebiliriz.


TestQuery.SQL.Text := 'SELECT 1';
TestQuery.Open; // Bağlantıyı zorla test et

Şeklinde sorguyu çalıştırıp bağlantı mevcut mu kontrol edebiliriz. Eğer ilk çözüm olmazsa bu şekilde de kontrol edebilirsiniz.
Cevapla
#5
commadtimeout süresini düşürmeme rağmen ADOQuery'nin bağlantının koptuğunu anlaması 20 sn sürüyor, bu ado nun bir sorunu sanırım.
pek verimli olmadı bu yöntem.
Cevapla
#6
(03-11-2025, Saat: 18:31)Under Adlı Kullanıcıdan Alıntı: commadtimeout süresini düşürmeme rağmen ADOQuery'nin bağlantının koptuğunu anlaması 20 sn sürüyor, bu ado nun bir sorunu sanırım.
pek verimli olmadı bu yöntem.

 ConGenel.ConnectionTimeout := 5;  // Bağlanma timeout: 5 saniye
 ConGenel.CommandTimeout := 3;     // Sorgu timeout: 3 saniye

Kendi örneğimde bu şekilde ayarlayıp kullanıyorum fakat çok yaşamıyorum bağlantı kopma durumunu bu yüzden 20sn olayına bir şey söyleyemiyorum. Umarım halledebilirsiniz, kolay gelsin : )
Cevapla
#7
daha tecrübeli arkadaşlardan yardım bekliyorum.
Cevapla
#8
(04-11-2025, Saat: 15:06)Under Adlı Kullanıcıdan Alıntı: daha tecrübeli arkadaşlardan yardım bekliyorum.

FireDac kullan kopunca kendisi tekrar bağlanıyor.
Cevapla
#9
(04-11-2025, Saat: 15:58)endmuh Adlı Kullanıcıdan Alıntı: FireDac kullan kopunca kendisi tekrar bağlanıyor.

Konu sahibi Delphi 7 kullandığını belirtiyor.
Cevapla
#10
kendimce şöyle bir çözüm geliştirdim:

aşağıdaki kod ile 1 dakika aralıkla sistemin boşta kalma süresini kontrol ediyorum,

function IdleTime: DWord;         //fonksiyon, sistemin boşta kalma süresini saniye cinsinden tamsayı olarak döndürür
var
  liInfo: TLastInputInfo;
begin
  liInfo.cbSize := SizeOf(TLastInputInfo) ;
  GetLastInputInfo(liInfo) ;
  Result := (GetTickCount - liInfo.dwTime) DIV 1000;
end;

eğer sistem 4 dakikadan fazla süredir boşta ise aşağıdaki kod ile ESC tuşuna basıyorum:
keybd_event(VK_ESCAPE, 0, 0, 0);

böylece windows hiçbir zaman uyku moduna geçemiyor, geçtiyse bile ESC tuşu ile uyanıyor...
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  matematiksel karşılaştırma hatası nevzatc 7 440 14-04-2026, Saat: 06:36
Son Yorum: emailx45
  yapay zeka delphi kl007 9 622 26-02-2026, Saat: 09:12
Son Yorum: mrmarman
  Win 11 ve Delphi 7 Minimize sorunu. enigma 7 495 11-02-2026, Saat: 10:27
Son Yorum: RAD Coder
Question Delphi formunu nasıl otomatik tam ekran yapabilirim ? erdemklt0 2 321 23-01-2026, Saat: 10:02
Son Yorum: csunguray
  Delphi SLL kullanım sorunu Bay_Y 12 1.317 22-12-2025, Saat: 18:11
Son Yorum: Bay_Y



Konuyu Okuyanlar: 1 Ziyaretçi