Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
ADOConnection Conneted 'da Sql Stop Sorunu
#1
Merhabalar 
ADOConnection1.Connected Sql server sonradan stop olursa True değeri döndürüyor. 
bende Rollback yaparken hata alıyorum

bu kısmı try-except'e almadan ADOConnection'ın durumunu refresh yapabilir miyiz?


Finally

   if ADOConnection1.Connected then
   if Hata then
   ADOConnection1.RollbackTrans;

end;
Cevapla
#2
İyi günler. SQL Server hizmeti bir şekilde durdurulursa artık ne yaparsanız yapın bir istisna (exception) oluşacaktır. Eğer illaki commit veya rollback işlemi yapılacaksa bunu sql komutlarıyla yönetebilirsiniz.
try
  ADOConnection1.Execute('BEGIN TRANSACTION');
  ...
  ...
  ...
  ADOConnection1.Execute('IF @@TRANCOUNT>0 COMMIT TRANSACTION');
except
  on E:Exception do begin
    ADOConnection1.Execute('IF @@TRANCOUNT>0 ROLLBACK TRANSACTION');
    ShowMessage(E.Message);
  end;
end;
biçiminde kodlayarak commit ya da rollback kodlarını kontrol altına alabilirsiniz ama başta da belirttiğim gibi SQL Server hizmeti bir şekilde durdurulursa artık ADO ile yapılan her türlü işlem hata üretecektir. İyi çalışmalar.
Cevapla
#3
Gönderdiğiniz sorgular başarılı bir şekilde çalışıp çalışmadığı bilgisi ile ilerlemeniz daha faydalı olur. Sorgu hataya düşerse veya "başarılı bir şekilde çalıştım" bilgisi geri dönmezse ilgili tabloya Rollback yaparsınız. Diğer türlü Pascal kodunuz SQL Server servislerinin durup durmadığını AdoConnection nesnesi ile yönetemez. Bu imkansız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#4
Öncelikle belirteyim, mevcut Connection bir nedenden ötürü koptu ise; zaten açık transaction'lar Rollback olurlar. Sizin arzu ettiğiniz Connection'ın kopmasından haberdar olmak ise maalesef ADO'nun böyle bir desteği yok. Ancak, bu yapamazsınız demek de değil. Arka planda programınız açık olduğu müddetçe çalışacak bir bir thread yapıp, belirli periyotlar ile bir Connection üzerinden veritabanı sunucusuna sorgu atabilirsiniz. Tabii bu sorgunun basit ve minimum maaliyetli bir sorgu olması tercih edilir. Örneğin; bir string'în reverse edilmesi, gönderdiğiniz bir sayının 1000'den farkının geri döndürülmesi vb.

Bu sayede veritabanı sunucusuna erişebildiğinizi ya da erişemediğinizi anlayabilirsiniz. Erişememeniz için birden fazla neden olabilir. Veritabanı sunucusunun servisinin durmuş olması, ilgili makinanın kapalı olması, network problemleri vs. Böyle bir durum ile karşılaştığınızda, ilgili thread ana thread'i bilgilendirebilir ve ana thread mevcut Connection nesnesini kapatıp yeniden açmayı deneyebilir. Ya da kullanıcıyı durum hakkında bilgilendirir ve veritabanı ile ilgili iş yapacak olan modülleri bir şekilde kilitlersiniz.

Çözüm aradıktan sonra elbette çözümsüz değiliz ;-)
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#5
Merhaba,

Eğer server elektriğinin gidip gelmesi, serverin anlık kapanması vb. durumlarda bağlantının aktiflik durumunu doğru olarak elde etmek istiyorsanız Connection nesnesine ait ClearPool diye bir metot mevcut. Bunu araştırmanızı öneririm.

Aksi durumlarda bağlantı havuzunda mevcut bir bağlantı olduğu için performans sebebiyle bu bağlantının durumunu size cevap olarak dönebiliyor. Bu sefer bağlantı gitmiş bile olsa siz bağlantı açık sanıyorsunuz.

Tabii bu dediklerim Disconnected olarak tasarlanmış bir uygulama için kullanıma uygun. Siz uygulama açılışında bir connection açıp kapatılana kadar o uygulama üzerinden devam ediyorsanız size uygun bir çözüm olmayacaktır.
Cevapla
#6
(05-10-2018, Saat: 09:32)mustafasivlin Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba,

Eğer server elektriğinin gidip gelmesi, serverin anlık kapanması vb. durumlarda bağlantının aktiflik durumunu doğru olarak elde etmek istiyorsanız Connection nesnesine ait ClearPool diye bir metot mevcut. Bunu araştırmanızı öneririm.

Aksi durumlarda bağlantı havuzunda mevcut bir bağlantı olduğu için performans sebebiyle bu bağlantının durumunu size cevap olarak dönebiliyor. Bu sefer bağlantı gitmiş bile olsa siz bağlantı açık sanıyorsunuz.

Tabii bu dediklerim Disconnected olarak tasarlanmış bir uygulama için kullanıma uygun. Siz uygulama açılışında bir connection açıp kapatılana kadar o uygulama üzerinden devam ediyorsanız size uygun bir çözüm olmayacaktır.

ClearPool fonksiyonu isminden de anlaşılacağı üzere mevcut bağlantının olduğu havuzun temizlenmesi. Uygulamanın veritabanına bağlandığı boruları kesmek veritabanının çalışıp çalışmadığı bilgisi döndürmekten ziyade var olan bağlantıları uçurup yeni bağlantı için kaynak tüketimini arttıracaktır.

@emrahgs; En sağlıklı yöntem daha önce belirttiğim ve @Tuğrul HELVACI hocamızın belirttiği yöntem; basit bir sorgu gönderip dönüş bilgisini denetlemek.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#7
(05-10-2018, Saat: 09:32)mustafasivlin Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba,

Eğer server elektriğinin gidip gelmesi, serverin anlık kapanması vb. durumlarda bağlantının aktiflik durumunu doğru olarak elde etmek istiyorsanız Connection nesnesine ait ClearPool diye bir metot mevcut. Bunu araştırmanızı öneririm.

Aksi durumlarda bağlantı havuzunda mevcut bir bağlantı olduğu için performans sebebiyle bu bağlantının durumunu size cevap olarak dönebiliyor. Bu sefer bağlantı gitmiş bile olsa siz bağlantı açık sanıyorsunuz.

Tabii bu dediklerim Disconnected olarak tasarlanmış bir uygulama için kullanıma uygun. Siz uygulama açılışında bir connection açıp kapatılana kadar o uygulama üzerinden devam ediyorsanız size uygun bir çözüm olmayacaktır.

Hangi Connection sınıfından bahsediyorsunuz ?
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#8
Merhaba,

@Abdullah ILGAZ Evet dediğiniz gibi ClearPool bağlantı havuzunun temizlenmesini sağlar ve her seferinde yeni bağlantı oluşturulması belirli bir performans kaybına sebep olur. Sadece ihtiyaç duyulduğu anda bağlantı kurulup sonrasında bağlantı kapatılıyorsa performans kaybını da göze alıyorsanız mantıklı. Örneğin (.Net için örnek verdiğimi belirteyim) client in network kablosu kısa bir süre için çekildi ve tekrar takıldı diyelim. Böyle bir durumda bağlantınız kopuyor ama ClearPool kullanmazsanız bağlantının koptuğunu anlayamıyorsunuz.

@Tuğrul HELVACI ClearPool metodundan bahsederken .Net baz alarak açıklama yaptım. Delphi tarafında AdoConnection için bu mümkün mü/yada kullanılabilir bir özellik mi deneme imkanım olmadı maalesef. Bu sebeple yanlış anlamaya sebebiyet vermiş olabilir, kusura bakmayın.
Cevapla
#9
Cevaplarınız için teşekkür ederim.
@Tuğrul HELVACI hocamın önerdiği yöntem ile aştım
Veri Tabanına basit bir sorgu gönderdim.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  cxgrid String alan sorunu HuseyinF 7 227 25-09-2019, Saat: 16:54
Son Yorum: HuseyinF
  SetLength sorunu seci20 2 148 13-09-2019, Saat: 13:50
Son Yorum: seci20
  Writefile yazılan byte sorunu seci20 2 205 04-09-2019, Saat: 20:29
Son Yorum: seci20
  Fastreport barcod yazdirma sorunu TheEAK 8 657 30-07-2019, Saat: 17:09
Son Yorum: TheEAK
  FDMemTable1.Filter Sorunu Hk. pro_imaj 4 347 14-07-2019, Saat: 00:38
Son Yorum: pro_imaj



Konuyu Okuyanlar: 1 Ziyaretçi