- Konu sahibi
- #1
Uygulama kapanırken önce devam eden veritabanı işlerini durdurun, kaydedilmemiş düzenlemeler için kullanıcıdan karar alın ve açık işlemleri uygun şekilde tamamlayın. Ardından sorguları ve bağlantıyı kapatın. Bağlantıyı kapatmak, kullanıcının düzenlediği verilerin kaydedildiğini tek başına göstermez. Aşağıdaki örnek, VCL ve FireDAC kullanan bir uygulamada tamamlanmamış işlemi geri alarak kapanmayı gösterir.
Kullanıcı değişikliklerden vazgeçerse düzenlenen kaydı iptal edin ve henüz kesinleştirilmemiş veritabanı işlemini
FireDAC'te bağlantı kapatılırken açık işleme uygulanacak davranış
Ana formun
Olayda önce sorgu kapatılır, ardından işlem açıksa geri alınır ve bağlantı kapatılır. Hata oluşursa
Örnek yalnızca bağlantının kullandığı işlem için geçerlidir. Ayrı
Kapatma hatası sürerse hatanın sorgu kapatma, rollback veya bağlantıyı kapatma aşamalarından hangisinde oluştuğunu belirleyin. Tanılama kaydına aşamayı, hata türünü ve zamanını alın; parola, bağlantı dizesi ve kişisel verileri kaydetmeyin. Veritabanı yöneticisinden bu bilgilerle ilgili oturumun ve işlemin durumunu incelemesini isteyin. Özellikle commit sırasında bağlantı kesilmişse işlemi körü körüne tekrarlamadan önce kaydın veritabanındaki durumunu doğrulayın. Geçici tanılama çıktısını sorun giderildiğinde kaldırın.
Kapatmadan önce veriye karar verin
Kullanıcının formda düzenlediği kaydı önce kaydetmesi veya değişikliklerden vazgeçmesi gerekir. Kaydetmeyi seçerse veri kümesindeki düzenlemeyi tamamlayın; önbelleğe alınmış güncellemeler kullanılıyorsa bunları da uygulamanın mevcut kayıt akışına göre veritabanına gönderin. İşlem açıkça yönetiliyorsa başarılı kayıt sonrasındaCommit ile kesinleştirin. Kayıt ya da commit başarısız olursa kapanmayı iptal edin ve kullanıcıya düzeltme veya yeniden deneme fırsatı verin.Kullanıcı değişikliklerden vazgeçerse düzenlenen kaydı iptal edin ve henüz kesinleştirilmemiş veritabanı işlemini
Rollback ile geri alın. Rollback, daha önce commit edilmiş değişiklikleri geri almaz. Kapanışta açık işlem bulunmasını, otomatik olarak commit edilmesi için gerekçe saymayın: işlem tamamlanmamış olabilir.FireDAC'te bağlantı kapatılırken açık işleme uygulanacak davranış
TxOptions.DisconnectAction ile belirlenir; belgelenen varsayılan davranış commit'tir. Bu nedenle yalnızca Connected := False yazıp açık işlemin geri alınacağını varsaymayın.FireDAC bağlantısını kapanışta kapatın
Aşağıdaki varsayımsal örnekte ana VCL formundaFDConnection1 ve ona bağlı FDQuery1 bulunur. Kod, kullanıcıya ait kaydetme veya vazgeçme kararının daha önce işlendiğini, arka plan işi bulunmadığını ve ayrı işlem nesneleri ya da iç içe işlemler kullanılmadığını varsayar. Kalan tek açık işlem varsa bu örnek onu geri alır.Ana formun
OnCloseQuery olayına aşağıdaki yöntemi bağlayın; form biriminde System.SysUtils ve Vcl.Dialogs kullanılıyor olmalıdır:
Kod:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := False;
try
FDQuery1.Close;
if FDConnection1.InTransaction then
FDConnection1.Rollback;
FDConnection1.Connected := False;
CanClose := True;
except
on E: Exception do
ShowMessage('Veritabanı kapatılamadı. İşlemi kontrol edip yeniden deneyin.');
end;
end;
Olayda önce sorgu kapatılır, ardından işlem açıksa geri alınır ve bağlantı kapatılır. Hata oluşursa
CanClose false kaldığı için formun kapanması engellenir. Uygulamada birden fazla sorgu varsa aynı bağlantıyı kullanan diğer sorguları da kapatın. Düzenleme hâlindeki veri kümelerini kapatmadan önce kaydetme veya iptal kararını tamamlayın.Örnek yalnızca bağlantının kullandığı işlem için geçerlidir. Ayrı
TFDTransaction nesneleri veya iç içe işlemler varsa her işlemi kendi yaşam döngüsü ve iş kurallarına göre tamamlayın; tek bir Rollback çağrısının bütün işlemleri geri aldığını varsaymayın. FireDAC dışındaki bağlantı bileşenlerinde işlem ve kapatma yöntemlerini kullandığınız bileşenin belgelerine göre uyarlayın.Kapanmayı ve olası hataları doğrulayın
Örneği önce test veritabanında deneyin. Açık bir işlemde değişiklik yapıp commit etmeden uygulamayı kapatın; ardından yeniden bağlanıp ilgili kaydı sorgulayın. Değişikliğin görünmemesi, bu testte geri almanın çalıştığını gösterir. Ayrı bir denemede değişikliği normal kayıt akışıyla commit edip kapattıktan sonra tekrar sorgulayın; değişiklik görünüyorsa kayıt kalıcı olarak ulaşılabilirdir.Connected değerinin false olması, FireDAC bileşeninin bağlantıyı kapalı gördüğünü gösterir; daha önceki bir commit'in başarıyla gerçekleştiğini kanıtlamaz. Bağlantı havuzu kullanılıyorsa bağlantının kapatılması fiziksel oturumun hemen yok edildiği anlamına da gelmez.Kapatma hatası sürerse hatanın sorgu kapatma, rollback veya bağlantıyı kapatma aşamalarından hangisinde oluştuğunu belirleyin. Tanılama kaydına aşamayı, hata türünü ve zamanını alın; parola, bağlantı dizesi ve kişisel verileri kaydetmeyin. Veritabanı yöneticisinden bu bilgilerle ilgili oturumun ve işlemin durumunu incelemesini isteyin. Özellikle commit sırasında bağlantı kesilmişse işlemi körü körüne tekrarlamadan önce kaydın veritabanındaki durumunu doğrulayın. Geçici tanılama çıktısını sorun giderildiğinde kaldırın.
Arka plan iş parçacıkları varsa
Kapanış isteğinde yeni iş başlatılmasını engelleyin ve çalışan veritabanı işlerine bitme veya güvenli biçimde iptal edilme fırsatı verin. Her iş parçacığının kullandığı sorgu, işlem ve bağlantı kapatılmadan önce o işin tamamlandığından emin olun. Aynı FireDAC bağlantısı ve ona bağlı nesneler aynı anda birden fazla iş parçacığından kullanılmamalıdır. Ana iş parçacığına geri çağrı bekleyen bir işi, ana iş parçacığını bloke ederek beklemek kilitlenmeye yol açabileceğinden kapanış akışını buna göre düzenleyin.
Moderatör tarafında düzenlendi: