ibqueryde insert esnasında generator sayısını alma?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kaptan
Üye
Mesajlar: 395
Kayıt: 01 Tem 2005 04:02

ibqueryde insert esnasında generator sayısını alma?

Mesaj gönderen Kaptan »

Selamlar.

bir döngü kurarak veritabanına kayıt yapıyorum. ibdatasetle çok yavaş kaydediyor. Nedenini bilmiyorum.
ibquery ile denedim. hızlı kaydetti. fakat kaydederken id numarasını execsql yapmadan bilmem gerekiyor. Nasıl bilebilirim.

Kod: Tümünü seç

dm.qsql.Close;
dm.qsql.SQL.Text:='insert into isler(isid,isim) values(:isid,:isim)';
dm.qsql.ParamByName('isim').Value:=dm.qsql2ISIM.Value;
Showmessage(inttostr(dm.qsqlISID.value));  Bu kısımda isid yi alabilmeliyim!
dm.qsql.ExecSQL;
isid veritabanı tarafından trigger ve generator ile artıyor.

Teşekkürler.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

table'ın son kaydına konumlan ve değeri oku, bir fazlası bir sonraki kayda verilecek değerdir.
Kaptan
Üye
Mesajlar: 395
Kayıt: 01 Tem 2005 04:02

Mesaj gönderen Kaptan »

Teşekkürler fakat direk triggerdan alabilirsem benim için daha iyi olacak. bunun bi yolu yok mu?
Program ağ üzerinde çalışacağı için ve o an için commit edilmeyen son kaydın idsini almış olabileceğim için ağda çakışma olabilir. Kayıtlar burda döngüyle ekleniyor. onun için direk triggerin verdiği idyi almam gerekiyor. bu ibdataset ile oluyor fakat ibquery ile olmuyor. ibdatasetle
ibdataset.insert;
Showmessage(ibdatasetid.value)...
ibdataset1.post;
gibi bir kodla o an ekleyeceği id gösterilebiliyor.
ibdataset de queryye göre çok yavaş kalıyor :?
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Merhaba,

Şöyle bir şey aklıma geldi, seninki mantıksal bir yol kod veya veri tabanı tarafından çözüm istiyorum dersen bilemem,

nitrokonat arkadaşın dediği gibi son kayda konumlanmak. şöyleki insert işlemi için butona basıldığında ayrı bir query ile max kayıt idno yu bularak +1 ekleme sonucu o an formun bir kenarında dbtext ile kullanıcıya bak yapacağın yeni işlem ile bu kayıt numarasını vereceksin ha demek. bilmem olurmu

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Re: ibqueryde insert esnasında generator sayısını alma?

Mesaj gönderen fduman »

Generator değerini bilmek istiyorsan, GEN_ID komutunu kullanmalısın.

Kod: Tümünü seç

select gen_id(generator_adı, 1) from rdb$generators
Bu kod generatorun o anki değerini 1 arttırarak geriye sonucunu döndürür.

Generatorun o anki değerini ise:

Kod: Tümünü seç

select gen_id(generator_adı, 0) from rdb$generators
komutu verir.

Senin bu komutu ayrı bir ibquery'de çalıştırıp alman ve işleminde kullanman gerekli.

Ayrıca bkz. viewtopic.php?t=9847
Kaptan
Üye
Mesajlar: 395
Kayıt: 01 Tem 2005 04:02

Mesaj gönderen Kaptan »

İlgilenen herkese teşekkürler.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

(Maxkayitno + 1) değerini alıp insert querysinde kullanmanın sakıncaları var.

1) Eğer tabloda önceden max değer 200 ise ve siz bu kaydı silmişseniz. Yeni ekleyeceğiniz kayıt yine 200 olur. Eğer 200 nolu id'ye göre başka tablolardan referans varsa kayıtlar birbirine karışabilir. Tabiki foreign key kullanıp silinme halinde Cascade veya setnull olmasını ayarladıysanız böyle birşey olmaz. Generator tablodan bağımsız arttığı için her zaman ekleyeceğiniz kayıt id'si silinmiş kayıtlardan büyük olacaktır.

2) Çok kullanıcılı sistemlerde (maxkayitno + 1) aldıktan sonra kayıt insertleyene kadar geçen sürede başka bir transaction da aynı işlemi yapıp aynı numarayı eklemeye çalışabilirler. Ama generator transactiondan bağımsız bir yapıdır. Sırf bu yüzden generator kullanmalısın
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Re: ibqueryde insert esnasında generator sayısını alma?

Mesaj gönderen rsimsek »

fduman yazdı:Generator değerini bilmek istiyorsan, GEN_ID komutunu kullanmalısın.

Kod: Tümünü seç

select gen_id(generator_adı, 1) from rdb$generators
Bu kod generatorun o anki değerini 1 arttırarak geriye sonucunu döndürür.

Generatorun o anki değerini ise:

Kod: Tümünü seç

select gen_id(generator_adı, 0) from rdb$generators
komutu verir.

Senin bu komutu ayrı bir ibquery'de çalıştırıp alman ve işleminde kullanman gerekli.

Ayrıca bkz. viewtopic.php?t=9847
Geçmiş bir konu ama dikkatimi çekti. Generator sorgu ve işlemlerinde rdb$generators tablosu kullanıldığında tüm generator ler için işlem yapılmakta :!: O yüzden where kısmını eklemek ve sorguyu aşağıdaki gibi değiştirmek gerekiyor;

Kod: Tümünü seç

select rdb$generator_id from rdb$generators 
where rdb$generator_name='generator_adı'
ya da;

Kod: Tümünü seç

select gen_id(generator_adı, 1) from rdb$database
şeklinde kullanmalısınız :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla