FireBird ile ilgili birkaç soru...

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
palandoken
Üye
Mesajlar: 151
Kayıt: 16 Eki 2006 10:43
Konum: ERZURUM

FireBird ile ilgili birkaç soru...

Mesaj gönderen palandoken »

Merhaba,

FireBird'ü anlamaya başladım.Ama kafama takılan birkaç soru var.

Soru 1:
Kaydetme , silme , güncelleme vb. işlemler için IBTable kullanmama gerek var mı? Yoksa bunların hepsini IBQuery ile halledebilir miyim?Veya bunları sadece bir IBDataset ile halletmek mümkün mü?Eğer mümkünse nasıl yapıcam?

Soru 2:
IBDataset'in SelectSQL,ModifySQL,InsertSQL,UpdateSQL propertislerine yazdığımız sql kodlarını Delphi'den nasıl çağırabilirim?Bu propertislere sql kodlarını yazdıktan sonra FireBird'de örneğin update işlemi için ayrıca Stored Procedure yazmama gerek var mı?

Soru 3:
Update işlemi için yazdığım aşağıdaki stored procedurü Dephi'den nasıl çağırabilirim?

Kod: Tümünü seç

CREATE PROCEDURE SP_KULLANICILAR_GUNCELLE(
  PIDNO INTEGER DEFAULT NULL,
  PADI VARCHAR(20) CHARACTER SET WIN1254 DEFAULT NULL,
  PSIFRE VARCHAR(8) CHARACTER SET WIN1254 DEFAULT NULL,
  PYETKI VARCHAR(20) CHARACTER SET WIN1254 DEFAULT NULL,
  PSORU VARCHAR(20) CHARACTER SET WIN1254 DEFAULT NULL,
  PCEVAP VARCHAR(20) CHARACTER SET WIN1254 DEFAULT NULL)
AS
BEGIN
   UPDATE KULLANICILAR SET
   IDNO=:PIDNO,ADI=:PADI,SIFRE=:PSIFRE,YETKI=:PYETKI,
   SORU=:PSORU,CEVAP=:PCEVAP
   WHERE IDNO=:PIDNO;
  /* Procedure body */
  SUSPEND;
END;
Soru 4:
FireBird'de yazdığım Stored Procedure'leri Delphi'den çağırabilmek için TIBStoredProc kullanmaktan başka bir seçenek yok mu?

Teşekkürler...
En son palandoken tarafından 01 Şub 2007 07:52 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
akıllanma , aklını başına toplama , toparlanma , kendisini derleme bu dünyaya ait bir vazife.
ahirette nasıl olsa aklın başına gelecek.
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

forumdan ve delphiturkiye sitesindeki makaleler sonucunda çıkardığım mantık tablo işlemlerinde SP kullanmak performans açısından en verimli olanı ve yine bu okumalarım sonucunda SP ler server tarafında gömülü olarak çalıştığı için server a sql kodu göndererek yapılan işlemlerden daha hızlılar yaklaşık 3 aydır firebird kullanmaya çalışıyorum. Projemin VT tasarımını ancak bitirebildim şuan projenin delphi kanadındayım. Projemde mümkün olduğunca server bazlı çalışmak için uğraşıyorum. Bunun bir sebebide veri bütünlüğünün bozulmasını engellemek

SP yi Delphiden çağırmaya gelince bilgilerim kadarı ile :

Kod: Tümünü seç

begin
IBStoredProc1.Prepare;
IBStoredProc1.ParamByName('PIDNO').AsInteger:=strtoint(edit1.text);
IBStoredProc1.ParamByName('PADI').AsString:=edit2.text;
IBStoredProc1.ParamByName('PSIFRE').AsString:=edit3.text;
IBStoredProc1.ParamByName('PYETKI').AsString:=edit4.text;
IBStoredProc1.ParamByName('PSORU').AsString:=edit5.text;
IBStoredProc1.ParamByName('PCEVAP').AsString:=edit6.text;
IBStoredProc1.ExecProc;
IBStoredProc1.UnPrepare;
end;
Buradaki degerleri değişkenler atamadan önce (karakter sayısı vb.) uygunluğunu kontrol etmen hata var ise serverdan hata mesajı almayı beklemektense hatayı ilk noktada yakalayıp (Delphi ile yazdığın Projende) kullanıcıyı hatayı düzeltmeye zorlaman daha iyi bir yaklaşım olur. konu ile ilgili olarak aşağıdaki linkteki makale yol gösterici olacaktır. Ben şuan bu makaleye bakarak kod yazıyorum. :) Üstadlara şimdiden teşekkürler her daim yardım elleri üzerimizde

IBX bileşenleri ile ilgili :
http://www.delphiturkiye.com/index.php? ... xgiris.htm
Genel Veri Tabanı ile ilgili :
http://www.delphiturkiye.com/index.php? ... tabani.htm
Arama Özelliklerinden Maksimum Yararlanın Sorularınıza Hızlı Cevap Bulun

Ben Acemi Birisiyim Hatalarım İçin Hoş Görünüze Sığınıyorum. Teşekkürler
palandoken
Üye
Mesajlar: 151
Kayıt: 16 Eki 2006 10:43
Konum: ERZURUM

Mesaj gönderen palandoken »

Merhaba,

armadillo bir sorum olacak.Projemin VT tasarımını ancak bitirebildim şuan projenin delphi kanadındayım demişsin.

Anladığım kadarıyla Delphi'ye hiç bulaşmadan önce VT'ni tasarlamışsın.VT'ni tasarlarken nasıl bir yol izledin.Nereden başladın.Nasıl bir plan yaptın.Biraz anlatır mısın?
akıllanma , aklını başına toplama , toparlanma , kendisini derleme bu dünyaya ait bir vazife.
ahirette nasıl olsa aklın başına gelecek.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

1. IBDataSet veya (FIBPlus ın FIBDataSet) bileşeni ihtiyaca göre yani silme değişiklik işleri de yapılacaksa ilgili (InsertSQL, UpdateSQL, DeleteSQL, RefreshSQL) SQL kodları alanlar seçilerek bileşenin sağ tuş SQL Generator ekranından oluşturulur. Sadece raporlama amaçlı kullanılacaksa SelectSQL in olması yeterli.

2. Yuarıdaki gibi yapılanmış bir IBDataSet bileşenine normal tablo bileşeni gibi tüm işlemler yaptırılabilir. UpdateSQL i yoksa zaten sorgu ya da tablo sadece okuma (read only) açılacaktır.

3. - 4.
@armadillo anladığım kadarıyla dersini iyi çalışmış :wink:
SP leri kullanmak için iki yöndem var: Biri bahsedildiği gibi IBStoredProc. IBStoredProc değer döndürmeyen SP leri için kullanılır :idea: Bir tablo gibi FOR SELECT ... sorgu yapısındaki SP ler ise normal tablolar gibi işlem görür, IBDataSet, IBQuery, IBTable gibi bileşenlerle kullanılabilirler.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

Hocam öncelikle FB ve SQL ile ilgili ne bulduysam okumaya ve anlamaya çalıştım. Başlangıçta sonuç olarak ne istediğimi biliyordum ama nasıl bu sonucu elde edeceğim sorusunun cevabı 1den fazla oluyor her zaman VT mantığını kavramamda Forumdan ve Kerem Köseoğlu'nun Veritabanı Mantığı Adlı kitabından faydalandım. Forumu daha ayrıntılı incelemediğim için bazı püf noktaları tatbik ederek zor yoldan öğrendim. ( Örnek vermek gerekirse FB deki domain kullanma mantığı Forumda birçok yerde alan tiplerinin domain kullanılarak belirlenmesi tavsiye ediliyor. Başlangıçta domainnin ne olduğunu bilmediğimden bu yakalaşımı kullanmadım hatta hata yapıp üzerinde bile durmadım. taki girişi yaklaşık 2 saat süren verilerin hepsini silip birim fiyat olarak belirlediğim bir alandaki numeric 4,2 alan tipini 4,6 yapmam gerekene kadar :lol: )

Öncelikle ben projemde veri bütünlüğü istediğim (belki benim projemde performansı çok fazla etkilemez çünkü küçük çaplı bir proje) ve performans kaygısı güttüğüm için yapılacak tüm işi server a yıktım. Bunun bir sebebide belki bu gün değil ama bir gün VT ye benim delphide yazdığım programdan başka bir programla ulaşılabileceği ihtimali idi. Bu arada VT tasarımı hala tam olarak bitmedi. Neden dersen delphi kanadında hazırladığım program ile VT arasındaki haberleşmeyi sağlamak için eventlar kullanacağım ve nasıl olduğunu henüz çözemedim. Anlayacağın projenin her aşamasında VT ye geri dönüp değişiklik ve ekleme yapmak gerekebiliyor. Daha bu projenin test aşaması var bahsetmek bile istemiyorum. :shock:

Genel olarak VT tasarlamakta öğrendiğim ve benimsediğim mantık:

1. Tablo, View, SP, Domain vs. islendirmelerinde ön takı kullanmak Tb_Giderler gibi.
2. Veri tiplerini domain kullanarak belirlemek. (Faydası deneyim ile sabit :))
3. Aritmetik ve mantıksal işlemlere giren alanları aynı tipte (Domainde) tanımlamak mümkün olduğunca.
4. VT tasarımını bitirmeden test amacı ile çok fazla veri girişi yapmamak. :wink:
5. Delphi kanadında veri girişlerinde veri tipi uygunluğunu delphi programına yaptırmak ( Hatayı ilk kaynağında yakalamak ve düzeltmek her zaman daha iyidir.)
6. VT ye mümkün olan en kısa süre ile bağlı kalmak.
7. VT ile program arasında gereksiz bilgi akışını engellemek ( Forumdan öğrendiğim bir konu daha) kullanıcıyı belirli kriterlere zorlamak.
8. Bu benim kendi düşüncem : Sorgularda SP kullanmak ve VT ye mümkün olduğunca az miktarda SQL sorgusu göndermek. Eğer yanlış anlamadıysam SP lerde sadece değişken değerleri ve sonuç VT ile program arasında gidip geliyor. ( Forumda bir çok yerde SP ler SQL sorgularından daha performaslı diye okuduğum için bu mantığı çıkardım.)Yazdığın kodda bir sorun var ise git bir kahve iç arkadaşların veya ailen ile bir kaç saat hoş vakit geçir. Rahatla ve tekrar kodlarını kontrol et. 3 gündür sabırsızlıkla cevap beklediğim bir sorunumdaki hatanın benim dikkatsizliğim olduğunu üstadlar sayesinde fark edince bu mantığı geliştirdim. PC başında çok fazla zaman geçirmek sanırım insanın zihnini bulandırıyor zaman zaman.

Benim bu 3 aylık çalışma sonucunda VT tasarımı konusunda geliştirdiğim mantığım.
Kafamda soru işareti olan konularla ilgili olarak sık sık foruma baş vuruyorum. Saolsunlar üstadlar her türlü konuda yardım ediyorlar.
Arama Özelliklerinden Maksimum Yararlanın Sorularınıza Hızlı Cevap Bulun

Ben Acemi Birisiyim Hatalarım İçin Hoş Görünüze Sığınıyorum. Teşekkürler
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

rsimsek yazdı:@armadillo anladığım kadarıyla dersini iyi çalışmış :wink:
Teşekkürler hocam sayenizde pişiyoruz yavaş yavaş
Arama Özelliklerinden Maksimum Yararlanın Sorularınıza Hızlı Cevap Bulun

Ben Acemi Birisiyim Hatalarım İçin Hoş Görünüze Sığınıyorum. Teşekkürler
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Re: FireBird ile ilgili birkaç soru...

Mesaj gönderen fduman »

palandoken yazdı: Soru 1:
Kaydetme , silme , güncelleme vb. işlemler için IBTable kullanmama gerek var mı? Yoksa bunların hepsini IBQuery ile halledebilir miyim?Veya bunları sadece bir IBDataset ile halletmek mümkün mü?Eğer mümkünse nasıl yapıcam?
IBTable'ı hemen hiç kullanmamalısın diyeyim. IBQuery ve IBDataset kullanarak işlemlere daha fazla hakim olursun. Çünkü işlemlerin gerçekleşeceği SQL kodunu sen belirlersin. Ben genellikle IBDataset kullanmayı tercih ederim. Ancak yerine göre IBQuery daha kullanışlı olabilir.

Öncelikle IBDataset'in içsel olarak nasıl işlem yaptığından bahsedeyim. Böylece yapı daha iyi anlaşılır.

IBDataset, veriyi sunucudan almak ve görüntüleyebilmek için SelectSQL property'sindeki SQL komutunu kullanır. Bu SQL komutu bir SELECT SQL'i olmalıdır. SQL içinde seçilen alanları ve WHERE içinde belirtilen aralığı sunucudan çeker.

InsertSQL, IBDataset'e Insert komutu ile veri eklenmek istendiğinde kullanılır. Yapısı gereği bunun da bir INSERT SQL'i olması lazım.

ModifySQL property'sine veri güncellemek için, Edit yapmak için gereken UPDATE SQL komutu yazılır.

Refresh SQL komutu ise o an Dataset üzerinde bulunulan satırı güncellemek için kullanılır. Bunun da bir SELECT SQL olması ve geriye tek kayıt döndürecek şekilde yazılması gerekir.

Bütün bu SQL komutlarını istersen elle yazabileceğin gibi, IBDataset SelectSQL'e yazdığın SQL komutundaki alan isimlerini kullanarak senin için oluşturabilir. Bunun için SelectSQL'e "SELECT * FROM Personel" gibi bir komut yaz. IBDataset üzerinde sağ tıkla, Dataset Editor'ü seç. Anahtar alanını ve güncellemek istediğin alanları işaretleyip, Generate SQL düğmesine bas. IBDataset alan isimlerini sunucudan alacak ve Insert, Delete, Modify ve Refresh SQL'lerini seçtiğin anahtar alan ve güncellenecek alanlara göre otomatik oluşturacaktır.
Soru 2:
IBDataset'in SelectSQL,ModifySQL,InsertSQL,UpdateSQL propertislerine yazdığımız sql kodlarını Delphi'den nasıl çağırabilirim?Bu propertislere sql kodlarını yazdıktan sonra FireBird'de örneğin update işlemi için ayrıca Stored Procedure yazmama gerek var mı?
Daha önce bahsettiğim gibi, IbDataset'in Insert methodu InsertSQL içindeki SQL'i otomatik çalıştıracak, Delete methodu ise DeleteSQL'i vs..
Stored Procedure'e gerek yok.
Soru 3:
Update işlemi için yazdığım aşağıdaki stored procedurü Dephi'den nasıl çağırabilirim?
IBStoredProc kullanmanı öneririm. Ancak IBDataset'in ModifySQL'inde
"EXECUTE PROCEDURE" SQL komutunu kullanabilirsin.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

armadillo yazdı:...Başlangıçta domainnin ne olduğunu bilmediğimden bu yakalaşımı kullanmadım hatta hata yapıp üzerinde bile durmadım. taki girişi yaklaşık 2 saat süren verilerin hepsini silip birim fiyat olarak belirlediğim bir alandaki numeric 4,2 alan tipini 4,6 yapmam gerekene kadar Laughing )
...
"Bir musibet bin nasihatten evla" dır, ya da bizim tabirle "tecrübe ile sabittır" gibi olmuş :lol: :lol:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
palandoken
Üye
Mesajlar: 151
Kayıt: 16 Eki 2006 10:43
Konum: ERZURUM

Re: FireBird ile ilgili birkaç soru...

Mesaj gönderen palandoken »

fduman yazdı: Daha önce bahsettiğim gibi, IbDataset'in Insert methodu InsertSQL içindeki SQL'i otomatik çalıştıracak, Delete methodu ise DeleteSQL'i vs..
Stored Procedure'e gerek yok.
Peki ben Delphiden Edit'lerdeki bilgileri bu INSERTSQL' nasıl aktarıcam.Editlerdeki değerleri INSERTSQL'deki parametrelere aktarmam lazım.Yoksa INSERTSQL nereden hangi değerleri alıp kaydedeceğini nereden bilecek.

fduman yazdı: IBStoredProc kullanmanı öneririm. Ancak IBDataset'in ModifySQL'inde
"EXECUTE PROCEDURE" SQL komutunu kullanabilirsin.
[/quote]


işte bu konuların hepsini forumdan , kitaplardan okuyorum ama bunları ben Delphi'den nasıl çalıştırıcam.Benim yaşadığım sorun bu.FireBird ile Delphi arasındaki bağlantıyı oluşturmada sıkıntı yaşıyorum.
akıllanma , aklını başına toplama , toparlanma , kendisini derleme bu dünyaya ait bir vazife.
ahirette nasıl olsa aklın başına gelecek.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Çalışma anında Edit.Text leri InsertSQL e ekleyebilirsin.

Kod: Tümünü seç

IBDataSet1.InsertSQL.Clear;
IBDataSet1.InsertSQL.Add(Edit1.Text);
IBDataSet1.InsertSQL.Add(Edit2.Text);
IBDataSet1.InsertSQL.Add(Edit3.Text);
//...
şeklinde.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla