Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

ÖNEMLİ AÇIKLAMA: MUTLAKA OKUYUNUZ!

Gönderen Konu: IBDatabase, IBTransaction, IBDataset, IBSql  (Okunma sayısı 5134 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
IBDatabase, IBTransaction, IBDataset, IBSql
« : 11 Ekim 2005 08:41:07 »
IBX Bileşenlerine Giriş ( IBDatabase, IBTransaction, IBDataset, IBSQL )
 

Bu yazımızda Interbase ve FireBird veritabanlarına direk erişim için kulanılan IBX setine bir giriş yapacağız. Bildiğiniz gibi Interbase veritabanını Borland üretiyor ve çok iyi bir Delphi desteği olması için Delphi'ye IBX seti eklendi.

Borland, bir süre önce artık InterBase veritabanını üretmeyeceğini duyurdu ve kodlarını açtı. Bu açık kodlarla Interbase 6 sürümü yayınlandı. Bu sürüm çok tutuldu. Bunun üzerine Borland kararından vazgeçti ve Interbase'i tekrar geliştirmeye ve satmaya başladı. Bunun üzerine açık koddan geliştirme yapan ekip (ki bunların çoğu eski Interbase ekibinden) kendi veritabanlarının ismini FireBird yaptılar ve geliştirmeye devam ettiler. Şu an FireBird, özellikle Delphi kullanan geliştiriciler arasında çok yaygın olarak kullanılıyor. Bedava, çok iyi bir Delphi desteği var, ufak ve orta çaplı projeler için çok uygun, kararlı bir veritabanı. Gözlemlediğim kadarıyla FireBird, Interbase 7'den daha çok tutuluyor ve kullanılıyor.

Delphi 7 ile gelen IBX seti, Interbase sekmesinde 13 veri erişim bileşeni ve Interbase Admin kısmında 11 yönetim bileşeni içerir. Interbase kısmında, verilere erişim için birçok bileşen var. Bunların kısa bir açıklamasından sonra adım adım bir InterBase/FireBird uygulaması geliştireceğiz. Daha Sonra Bileşenleri Detayıyla inceleyeceğiz.
 

Veri Erişim (Data Access) Bileşenleri
IBDatabase :Bu BDE uygulamalarındaki Database bileşenine benzer. Interbase veritabanına erişim sağlar. IBDatabase bileşeni transaction desteği sağlamaz. Tüm IBX dataset bileşenlerinde IBDatabase bileşeni belirtilmelidir

IBTransaction :
Transaction desteği sağlar. Tüm IBX dataset bileşenlerinde transaction bileşeni bağlamak gerekmektedir. Transaction olayının böyle ayrı bir bileşene bağlanmış olması, aynı anda birden fazla transaction'ın aktif olmasına olanak sağlamaktadır.

IBTable :
Bir table ve view'ın tüm alanlarına ve tüm kayıtlarına ulaşmak için kullanılır. Mevcut kayıtlar filtre edilebilir.

IBQuery :
Bir veya birden fazla tabledan, view'dan veya stored procedure'den yazılan SQL cümlesine uygun kayıtları döndürür. Dönen veri kümesi read only (salt okunur) dir.

 IBStoredProc :
Bir sonuç döndürmeyen stored procedure'leri çalıştırmak için kullanılır.

 IBUpdateSQL :
IBTable ve IBQuery ile cachedupdate çalışmak isterseniz, bu bileşeni kullanmanız gerekir.
 
IBDataset :
Genelde IBX'te en sık kullanılan veri erişim bileşenidir. Select, Insert, Update ve Delete işlemleri için SQL ifadeleri girmenize olanak tanır.

IBSQL :
 Bir sonuç döndürmeyen SQL cümlelerini çalıştırmak için idealdir.
 
- IBDatabaseInfo :
 Tam olarak bir veri erişim bileşeni değildir. Bağlı olduğunuz Interbase veritabanı hakkında bazı bilgileri almanızı sağlar. ODS sürümü, page size, kaç kullanıcı bağlı vb.
 
- IBSQLMonitor :
 Uygulamanızdan Interbase veritabanına gönderilen SQL cümlelerini kaydetmek ve göstermek için kullanılır. Bir şeyler ters gittiğinde teşhis için kulanılabilir.
 
- IBEvents :
 Interbase'de trigger ve stored procedure'lerde event (mesaj) yayınlama olanağı vardır. Bu mesaj o veritabanına bağlı tüm client'lara gönderilir. IBEvents ile bu mesajları yakalayıp, işleyebilirsiniz.
 
Bir IBX Uygulaması GeliştirelimTemel işlemlerde, diğer veritabanı uygulamaları geliştirmeden bir farkı yoktur. Sırasıyla

Yeni bir uygulama oluşturun.
Formunuza IBDatabase ve IBTransation bileşenlerini ekleyin.

 

IBDatabase'in Ayarları

Aşağıdaki iki ayarı mutlaka yapmalısınız :

1. DatabaseName : Bağlanacağımız veritabanı dosyasının yolu (path) ve ismi. Veritabanı dosyası kendi diskimizde olabileceği gibi ağ üzerinde bir bilgisayarda da olabilir.

2. DefaultTransaction : Koyduğumuz IBTransaction bileşenini atayın
 

IBDatabase'de ayarları yapmanın en kolay yolu Database Component Editor'ü kullanmaktır. IBDatabase'e sağ tıklayıp, Database Editor komutunu verin. Karşınıza aşağıdaki pencere gelecektir.



Bunun dışındaki diğer ayarlar seçimliktir. Bunlar :

-IdleTimer :  IBDatabase belli bir süre işlem yapmazsa otomatik kapatmak için. Bu değer 0 olursa otomatik olarak kapatılmaz.  
- LoginPrompt :  Bu seçenek aktif ise kullanıcıdan programın çalışması esnasında geçerli bir veritabanı kullanıcısı ve şifresi girmesi istenir. Kafadan False ayarlayın :)
- Params : Veritabanına bağlantı için gerekli kullanıcı ismi, şifre ve charset gibi parametreleri girmenizi sağlar. bunları kolay bir şekilde nasıl girebileceğiniz aşağıda anlatacağım.  
- SQLDialect : Interbase 6 için 3, Interbase 5 ve öncesi için 1 girin.  
- TraceFlags : IBSQLMonitor tarafından hangi işlemlerin kaydedileceği seçilir.
- AllowStreamedConnected Bu Özelliği False yaparsannız Design time da Databasenin Connected özelliği True olsa bile çalıştırdığınızda false olduğunu göreceksiniz.


 

Burada;

- Dosyanın kendi bilgisayarınızda mı (local), yoksa başka bir bilgisayarda mı (Remote) olduğunu seçebilirsiniz.
- Browse butonu ile veritabanı dosyasını seçebilirsiniz.
- Veritabanı parametrelerini ayarlayabilirsiniz :
- Username (kullanıcı ismi) : Varsayılan kullanıcı ismi SYSDBA'dır.
- Password (şifre) : Varsayılan şifre masterkey'dir.
- Character Set olarak Win1254 seçin, bu Türkçenin kodudur.
- LoginPrompt seçeneğinin işaretini kaldırın.
- Test butonu ile veritabanına bağlantıyı deneyebilirsiniz. Eğer ayarlar doğru ise "Successful connection" mesajı çıkmalı.
- OK butonu basarak ayarları tamamlayın.

 

Olayları
AfterConnect > Veritabanına Bağlandıktan sonra meydana gelir.

AfterDisconnect > Veritabanıyla Bağlantı kesildikten sonra meydana gelir.

BeforeConnect > Veritabanına Bağlanmadan önce meydana gelir.

BeforeDisconnect> Veritabanıyla Bağlantı kesilmeden önce  meydana gelir.

OnDialectDowngradeWarning > Database özelliğinin SQL Diallect özelliği herhangi bir bağlantı sonucu düştüğü zaman bu olay meydana gelir. örneğin SQL Dialect 3 ten 1 e düştüğü zaman bu olaya istediğiniz hata mesajını yazabilirsiniz.

OnIdleTimer > IdleTimer e verdiğiniz süre dolduğunda  meydana gelir.

OnLogin >  Kullanıcıya şifre sorulmadan önce meydana gelir. Database şifresini bu olayda kodla atayıp Loginpromp özelliğini false yaparak kendi şifre dialog kutunuzu kullanıcıya gösterebilirsiniz.


IBTransaction'ın Ayarları

DefaultDatabase : Koyduğumuz IBDatabase'i seçin.

IdleTimer : İşlem yaparken belli bir süre uygulamada hiç bir işlem yapılmazsa, transaction'ı otomatik olarak Commit veya Rollback yapabilirsiniz. Böyle birşey yapmak istiyorsanız, buraya bu süreyi girmelisiniz. DefaultAction özelliği ile de bu süre sonunda hangi işlemin gerçekleşmesini istediğinizi seçebilirsiniz.

Params : Burda Transaction parametrelerini girebilirsiniz. Ancak biz yine editor ile yapacağız bu işlemi. IBTransaction bileşenine sağ tıklatıp, Transaction Editor komutunu verin. Karşınıza aşağıdaki pencere gelir.


Burada transaction'un isolation level'ı seçilir. Dört seçeneğiniz var, bunlar :

Snapshot:
 Bu varsayılan isolation level'dır. Diğer transaction'lar sizin transaction'ınınız açıkken tablolarda değişiklik yapabilir ve bunları commit edebilirler. Sizin transaction'ınız aktifken bu değişiklikleri göremezsiniz.  
Read committed:
 Sizin transaction'ınız, diğer transaction'ların commit ettiği verileri görebilir.  
Read-Only Table Stability - Read-Write Table Stability:
Diğer transaction'lar, sizin transaction'ınız commit veya rollback yapana kadar, tabloları değiştiremezler.
 
Snapshot veya Read committed'ı seçerseniz, nowait seçeneği de eklenir. Bu parametre diğer transaction'lar tarafında kitlenmiş (lock) kayıtlara karşı nasıl davranılacağını belirler. Mesela bir kaydı silmek istediniz ve bu başka bir transaction tarafından kitli. nowait ayarlanmışsa, hemen bir hata döndürülür, eğer wait ayarlanmışsa diğer transaction'ın kayıtı serbest bırakması beklenir ve serbest kalınca kayıt silinir.

IBDataset'in Kullanımı
Bundan sonraki adım data modüle bir veri erişim bileşeni koymak. Eğer yeni bir Interbase uygulaması oluşturuyorsanız, IBDataset bileşenini kullanmanız iyi olur. Diğer veri erişim bileşenleri özel amaçlar için veya BDE tabanlı uygulamalar için uyumluluk için eklenmiştir.

İlk olarak Database özelliğini ayarlayın

. Burdan koyduğumuz IBDatabase bileşenini seçin. Bu özellik ile hangi veritabanına bağlanacağımızı seçiyoruz. Daha sonra kayıtları seçmek için gerekli SQL cümlesini SelectSQL kısmına yazmamız lazım. Mesela örnek olarak:

Kod: SQL
  1. SELECT * FROM EMPLOYEE WHERE Dept_No=:Dept_No

Gördüğünüz gibi IBDataset bileşeninde verilere erişmek ve verileri yönetmek için sonu SQL ile biten birçok özellik var. bunlar :

Özellik  
SelectSQL :
Bir veya birden fazla tablodan bazı kayıtları seçmek için kullanılan SQL ifadesi
RefreshSQL :
Sadece bir kayıt seçmek için kullanılan SQL ifadesi
InsertSQL :
Yeni bir kayıt eklemek için kullanılan SQL ifadesi
ModifySQL :
Bir kayıtı güncellemek için kullanılan SQL ifadesi
DeleteSQL :
Bir kayıtı silmek için kullanılan SQL ifadesi

Tabi yine Delphi güzelliği bu SQL ifadelerini elle yazmak zorunda değilsiniz. IBDataset'e sağ tıklayın ve Dataset Editor komutunu verin. Karşınıza aşağıdaki pencere gelecektir.



Get Table Fields butonuna tıklatın. Key Fields ve Update Fields kısımlarına tablonun tüm alanları getirilir. Her iki kısımda da tüm alanları seçmek için Dataset Defaults butonuna tıklatın. Key fields kımında otomatik olarak sadece primary key'in seçilmesi için Select Primary Keys butonuna tıklatın. Bunlar (Key fields) güncellenecek kayıtları tesbit için kullanılır. Update fields kısmında güncellenecek alanların listesi yer alır. Bazı durumlarda tüm kayıtları güncelemek istemeyebilirsiniz. Mesela burda FULL_NAME alanı bunun için güzel bir örnektir. Bu alan FIRST_NAME ve LAST_NAME alanlarının runtime birleştirilmesinden oluşmaktadır ve güncellenmemesi gerekir. Onun için bu alanı listeden çıkardık. Son olarak Generate SQL butonuna basıp SQL cümlelerini oluşturun. Cümleler oluşturulur ve SQL sekmesine geçilir.



Burda Statement Type kısmındaki radio butonlara tıklayarak SQL cümleleri arasında gezebilirsiniz. Otomatik olarak oluşturulan Modify SQL cümlesi aşağıdaki gibidir :

Kod: SQL
  1. UPDATE EMPLOYEE
  2. SET
  3. EMP_NO = :EMP_NO,
  4. FIRST_NAME = :FIRST_NAME,
  5. LAST_NAME = :LAST_NAME,
  6. PHONE_EXT = :PHONE_EXT,
  7. HIRE_DATE = :HIRE_DATE,
  8. DEPT_NO = :DEPT_NO,
  9. JOB_CODE = :JOB_CODE,
  10. JOB_GRADE = :JOB_GRADE,
  11. JOB_COUNTRY = :JOB_COUNTRY,
  12. SALARY = :SALARY
  13. WHERE
  14. EMP_NO = :OLD_EMP_NO

IBDataset bileşeni SQL cümlelerini oluştururken 2 tip parametre sunar. Birinci tipin isimleri çalıştığınız tablodaki alanların isimleridir. Bu parametreler her bir alanın yeni değerini içerir. İkinci tip parametrede alan isminin önünde OLD_ ifadesi bulunur. Bu parametre o alanın orjinal değerini döndürür. Burda gördüğünüz gibi her alanın yeni değeri atanmışken, where kısmında primary keyin eski değeri ile kayıta konumlanıp, değiştirilir.

Gördüğünüz gibi çok basit birkaç buton tıklatma ile gerekli tüm SQL cümlelerini oluşturduk, işte Delphi'nin gücü :)

Son olarak bu bileşende ayarlamak isteyebileceğimiz bir özellik daha var. Unidirectional. Interbase (ve diğer SQL veritabanları da) tek yönlü cursor'ler sunarlar ve bu ileri doğrudur. Geri dönülmesi gereken durumlar için Delphi bir bufferlama şeması sunar (buffering scheme). Bu ise daha fazla hafıza kullanıma ve daha uzun işlem süresi demektir. Bazı durumlarda, mesela raporlarda bu geri dönüşlere ihtiyacımız olmaz. Bu durumda bu özelliği True yaparak performansı artırabilirsiniz.


IBSQL'in Kullanımı
Client/Server uygulumada kullanıcını mümkün olduğu kadar az kayıtla çalışması iyidir. Bazen kullanıcıyı buna zorlamalısınız. Mesela kullandığımız IBDataset'te belli bir departmanda çalışan, işçileri seçmiştik. Bunun için kullanıcının bir yerden departmanları seçmesi lazım ki, bizde seçilen departmana göre çalışanları getirelim. Mesela bunu bir ComboBox'tan seçebilir. Bu durumda departman isimlerini ComboBox'a doldurmalıyız. Bu iş için IBSQL bileşeni idealdir. Bufferlaması olmadığından, sadece unidirectional hareket sağladığından ve data-aware(veri bilinçli) kontrolleri desteklemediğinden çok daha az kaynak harcar.

Bu bileşeni kullanmak için data module bir IBSQL bileşeni koyup, database özelliğini ayarlayın. SQL kısmına aşağıdaki SQL cümlesini yazın :

Kod: SQL
  1. SELECT DEPT_NO, DEPARTMENT FROM DEPARTMENT
  2. ORDER BY DEPARTMENT

bu cümle departmanları, departman ismine göre sıralı seçecektir. Bunu bir döngü yardımı ile ComboBox'a doldurabilirsiniz. Burada dikkat etmeniz gereken, IBSQL bileşeninin Active özelliği ve Open metodu yoktur. IBSQL'i ExecQuery ile açmalı ve Close ile de kapatmalısınız. Örneğin Formun OnShow olayında doldurabilirsiniz ComboBox'ı. ismi CB_Departman olsun,

Kod: Delphi
  1. procedure TForm1.FormShow(Sender: TObject);
  2. begin
  3. with DataModul, DataModul.IBSQL1 do
  4. begin
  5. IBTransaction1.StartTransaction;
  6. ExecQuery;
  7. while not EOF do
  8. begin
  9. Cb_Departman.Items.Add(FieldByName('Dept_No').Value + ' - ' +
  10. FieldByName('Department').Value);
  11. Next;
  12. end; {while}
  13. Close;
  14. IBTransaction1.Commit;
  15. end; {with}
  16. end;

Aşağıdaki durumlarda da IBSQL'i kullanmak iyi bir seçenek olacaktır.

* Bir tablodan diğerine veri aktarırken
* Veri export ederken
* Generator'den bir değer alırken
* DDL (Data Definition Language) ifadeleri (UPDATE vs.) çalıştırırken.

Kullanıcı Arabirimini Tamamlayalım
Kullanıcı arabirimini tamamlamak için bir DataSource bileşenini data module koyun ve dataset özelliğini IBDataset1 olarak ayarlayın. Daha sonra bir DBGrid koyup, DataSource özelliğini DataSource1 olarak ayarlayın. Daha önce CB_Departman isimli comboBox içine departman numaralarını ve isimlerini doldurmuştuk. Şimdi kullanıcı burdan bir departman seçtiği zaman, o departmanda çalışan işçileri seçmeliyiz. Bunun için Cb_Departmanın OnChange olayına aşağıdaki kodu yazın :
Kod: Delphi
  1. procedure TForm1.Cb_DepartmanChange(Sender: TObject);
  2. var
  3. DeptNo: Integer;
  4. begin
  5. DeptNo := StrToInt(Copy(Cb_Departman.Text, 1, 3));
  6. with DataModul, DataModul.IBDataSet1 do
  7. begin
  8. Close;
  9. if not IBTransaction1.InTransaction then
  10. IBTransaction1.StartTransaction;
  11. Params.ByName('Dept_No').AsInteger := DeptNo;
  12. Open;
  13. end; {with}
  14. end;

Bu kod seçilen öğenin ilk üç karakterini alır, bu departman kodudur. Bunu parametre olarak IBDataset1'e geçer ve o departmandaki işçiler seçilir.
ParamCheck > bu  özelliği Stored Procedur vb. oluştururken false yapın.

GoToFirstRecordOnExecute >  bu  özelliği True Yapılırsa Sorgu sonucunda ilk kayda konumlanır.

OnSQLChanging > bu olay Bileşen SQL Özelliğinde bulunan SQL kodu değişince meydana gelir.


Transaction'larla Çalışma
Interbase ile çalışırken herşey transaction'ların içinde olur. Birkaç kayıt seçen basit bir SQL cümlesi bile transaction içinde olmak zorundadır. Siz bu Select ifadesi için herhangi bir transaction'ı açıkca başlatmasanız bile IBX arka planda bir transaction kullanır.

Mesela yukarda CB_Departman isimli comboBox'a departman isimlerini alırken kullandığımız StartTransaction ve Commit ifadelerini kullanmaya gerek yoktur. Burda örnek vermek amacıyla kullandık :)

IBTransaction, Commit ve Rollback dışında transaction'ları bitirmek için iki metoda daha sahiptir : CommitRetainig ve RollbackRetaining. CommitRetainig aktif transaction'da yapılan tüm değişiklikleri veritabanına (dosyaya) yazar ve transaction'un içeriği tutulur. RoolbackRetaining'te aktif transaction'da yapılan tüm değişiklikler iptal edilir ve transaction'un içeriği tutulur.

Transaction bileşeninin bir faydası da uygulamanız aynı anda birden fazla transaction ile çalışabilir. Bunu BDE ile yapamazsınız. Mesela iki tane IBDataset bileşenine iki ayrı IBTransaction bağlayıp, ikisininde ayrı transactionlara sahip olmasını sağlayabilirsiniz. Bu iki IBDataset birbirinden bağımsız olarak yaptıkları değişikleri commit veya rollback yapabilir. Eğer Midas kullanıyorsanız bu bir zorunluluktur, her IBDataset'e ayrı IBTransaction bağlamalısınız.

Bilgilerin anında tabloya  yansıması için transactionu commit yada CommitRetaining etmelisiniz. Değişiklikleri geri almak  için ise
transactionu Rollback yada RollbackRetaining etmelisiniz. transactionu commit yada CommitRetaining komutunu verdikten sonra işlemi geri alamazsınız.. bazı durumlarda Retaining eki ile kulanılan komut işlem yapılmasına rağmen delphi bunu görmez.örneğin otomatik  artan alanın Trigger tarafından yapılması.  bu durumlarda Rollback yada commit bu kotu kullandığınızda  database ile bağlantı kesildiğinden tabloyu tekrar aktif yapmannız gerekecek.
Kullanımı
Kod: Delphi
  1. IBTransaction1.CommitRetaining;
  2. IBTransaction1.RollbackRetaining;

Kod: Delphi
  1. IBTransaction1.Commit;
  2. IBTransaction1.Rollback;

 Değişikliğin tabloya anında yansııması için bu kodlardan birini nereye yazmaslıyım diyorsanız. IBTable,IBQuery,IBDataset ( Hangisini kullanıyorsanız ) AfterPost ve AfterDelete olaylarına yazın.

Her Tablo için ayrı Transactinmu kullanmalıyım?
tavsiyem her kayıt girişi yapılan tablo için bir transaction kullan. diyelim iki tabloya post komutu verdiniz. bu iki tablo için de aynı transactionı kullanıyorsunuz. birinini commit ettiniz. doğal olarak transaction 2'sini birden dataya yazacak.  şimdi cari tablodaki değişiklikleri rollback yapmanız ve 2. tabloyuda commit etmeniz gerekecek. nasıl olacak? mantıken ben açıklamasını bulamadım.

Bu makalenin büyük bir kısmı http://www.delphiturkiye.com/ dan alıntıdır
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.