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.
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 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
Şö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.
(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
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;