doğru kullanım hangisi...

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

doğru kullanım hangisi...

Mesaj gönderen Lord_Ares »

Merhaba, firebirdte ibdataset ile kayıt ekle, sil gibi işlemler yaparken bu şekilde kullanıyorum.
örneğin kayıt ekleme

Kod: Tümünü seç

              DataM.TTURSATIS.Insert;
              DataM.TTURSATISTURADI.AsString:= Form1.TURCOMBO.Text;
              DataM.TTURSATIS.Post;

bu kodu herhangi bir sıkıntı yaşamadan kullanıyorum, aklıma takılan soru ise forumda okuduğum bazı konularda post işleminden sonra ibtransaction1.CommitRetaining; veya ibdataset1.ApplyUpdates; dememiz gerekiyormuş. her yazıda farklı bir şey görüyorum. Hal böyle olunca ikilemde kaldım, çünkü bazı yazılarda ve makalelerde bu işi ibtransection nesnesinin ibdataset1.post dedikten otomatik yaptığı bu yüzden buna gerek kalmadığı yazıyor.
Buna aydınlık getirmek amacıyla, sizlerden ricam doğru kullanım şeklini bana gösterebilir veya kayıt ekleme silme gibi işlemlerin doğru olan şeklinin nasıl yapıldığını göstermeniz.

yardımlarınız için teşekkürler..
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Re: doğru kullanım hangisi...

Mesaj gönderen rsimsek »

Siz biraz paradox mantığında kullanmışsınız. Doğrusu; diyelim bir fatura, fiş kayıtında birden fazla tabloda kayıt/güncelleme olacağından tutarlılık açısından Transaction başlatıp işler normal şekilde tamamlandıysa da transection u my_DataSet.Transaction.CommitRetaining; etmek. Aksi halde my_DataSet.Transaction.RollbackRetaining; i çağırıp hiç bir şey olmamışcasına veri tabanına pardon demek. :)

Burada kullanılan bileşenlerde de bazı ayarlar yapmak gerekiyor.

Örnek olarak FIB+ da

Kod: Tümünü seç

object tr_VeriTabani: TpFIBTransaction
    DefaultDatabase = db_VeriTabani
    TimeoutAction = TARollback
    TRParams.Strings = (
      'write'
      'nowait'
      'rec_version'
      'read_committed')
    TPBMode = tpbDefault
    Left = 40
    Top = 64
  end
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: doğru kullanım hangisi...

Mesaj gönderen Lord_Ares »

rsimsek abi çok ağır söyledin ya, acemi olduğum için anlayamadım :))))))
Sakıncası yoksa, üstteki örneğe göre(benim paylaşmış olduğum kayıt ekleme ) doğru kullanımı örnekler misin. Nasıl olmalı..
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: doğru kullanım hangisi...

Mesaj gönderen White Rose »

datasetinize bir transaction bağlayın transaction ayarlarını read commited olarak ayarlayın
datasetin afterpost ve afterdelete eventlerine de transaction.commitretaining komutunu ekleyin
anemos
Üye
Mesajlar: 110
Kayıt: 02 Nis 2007 07:51
Konum: Sakarya / Hendek

Re: doğru kullanım hangisi...

Mesaj gönderen anemos »

"Veritabanına pardon demek". Tuttum bunu. :mrgreen:
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Re: doğru kullanım hangisi...

Mesaj gönderen rsimsek »

Aradan biraz zaman geçmiş sorun çözüldü mü bilemiyorum. Aslında transaction olayı kavranırsa ne yapılmak istendiği daha kolay anlaşılacaktır. Transaction'u veri tabanına bağlantı kuran her kullanıcı ve uygulama için bir fanus gibi düşünebilirsiniz. Veri tabanından gönderdiği isteğe göre bilgi akışı var fakat kişi/uygulama istemedikçe veri tabanına herhangi bir kayıtlarda değişikliğe izin yok. Eğer işin başında transaction yapısını kurup yukarıda bahsedilen basit bir kaç ayarını yaptıktan sonra yapılan işlemlerin diske yansımasını istiyorsanız kaydet tuşuna basınca herhangi bir sorun yoksa try/except bloğu içinde my_DataSet.Transaction.CommitRetaining; sorun/hata oluşunca da except'deki my_DataSet.Transaction.RollbackRetaining; komutunu vermeniz yeterli oluyor. Post/Commit ederken veri tabanında herhangi bir hata/exception oluşursa otomatikmen rollback e düşecektir. Yoksa veri tabanı tutarlığından bahsedilemez.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: doğru kullanım hangisi...

Mesaj gönderen Lord_Ares »

Cevaplarınız için teşekkür ediyorum. Fakat şunu net anlamış değilim.
1) Formum da bir adet IBDatabase, bir adet IBTransaction ve bir adet IBDateSetim var.
2)IBTransactionın Transaction Editör deki ayarları ( üzerini çift tıkladığımda açılan) Read Committed seçili ve read_committed ,rec_version nowait olarak ayarlı
3)IBDataSet nesnemde Transection olarak formumdaki IBTransactionım ve uygun olan genarator seçilmiş durumda.

Kayıt girerken aşağıdaki şekilde kayıt girişi yapıyorum.

Kod: Tümünü seç

 
              DataM.TTURSATIS.Insert;
              DataM.TTURSATISTURADI.AsString:= Form1.TURCOMBO.Text;
              DataM.TTURSATIS.Post;
IBDataSete , IBTransaction tanımlanmış durumda olduğu için ibtransaction1.CommitRetaining olayını kendisi otomatik yapmıyor mu ? Bazı paylaşımlarda IBTransaction otomatik yapıyor ayrıca commit etmene gerek yok denmiş, bazısı da ayrıca commit yapmalısın demiş. Eğer ibtransaction1.CommitRetaining yapmam gerekiyorsa, yukarıdaki kodum şu şekilde mi olmalı. Nasıl kullanmalıyım.

Kod: Tümünü seç

 
              DataM.TTURSATIS.Insert;
              DataM.TTURSATISTURADI.AsString:= Form1.TURCOMBO.Text;
              DataM.TTURSATIS.Post;             
              ibtransaction1.CommitRetaining ;   
--Veya kodum ilk kod örneğindeki gibi değişmeden kalarak , datasetin afterpost ve afterdelete eventlerina transaction.commitretaining demem yeterlimi.
Master43
Üye
Mesajlar: 73
Kayıt: 17 Ara 2004 12:05

Re: doğru kullanım hangisi...

Mesaj gönderen Master43 »

Son satırda yazdığın

Kod: Tümünü seç

ibtransaction1.CommitRetaining ;
gerekli bir kod ancak düzgün bir kullanım değil. Böyle kullanırsan paradoxtan bir farkı kalmaz. Nasıl kullanılması gerektiğiği zaten rsimsek tarafından yazmış :D
rsimsek yazdı:...
Aslında transaction olayı kavranırsa ne yapılmak istendiği daha kolay anlaşılacaktır. Transaction'u veri tabanına bağlantı kuran her kullanıcı ve uygulama için bir fanus gibi düşünebilirsiniz. Veri tabanından gönderdiği isteğe göre bilgi akışı var fakat kişi/uygulama istemedikçe veri tabanına herhangi bir kayıtlarda değişikliğe izin yok. Eğer işin başında transaction yapısını kurup yukarıda bahsedilen basit bir kaç ayarını yaptıktan sonra yapılan işlemlerin diske yansımasını istiyorsanız kaydet tuşuna basınca herhangi bir sorun yoksa try/except bloğu içinde my_DataSet.Transaction.CommitRetaining; sorun/hata oluşunca da except'deki my_DataSet.Transaction.RollbackRetaining; komutunu vermeniz yeterli oluyor. Post/Commit ederken veri tabanında herhangi bir hata/exception oluşursa otomatikmen rollback e düşecektir. Yoksa veri tabanı tutarlığından bahsedilemez.
Bir ilave ekleyeyim, ibtransaction1.CommitRetaining; yazdığında ibtransaction1 nesnesine bağlı tüm datasetlerdeki değişiklikleri (insert, edit, delete) birkerede db'ye aktarıyorsun. Bu komut verilene kadar db'ye yazılmıyor.
Cevapla