Merhaba,
Öncelikle, IDENTITY türündeki alanların değerini okumak için mutlaka aşağıdaki gibi özel SQL kullanılmalı. Her bir SQL server için formatı değişir. SQL Server için şöyledir:
Kod: Tümünü seç
INSERT INTO testme (adi)
OUTPUT Inserted.autoinc
VALUES('deneme');
Eğer özel SQL komutu kullanılmaz ise Post işlemi sonrasında Query bileşeni Refresh edilmelidir. Bu iki yöntem dışında IDENTITY değerini öğrenmek mümkün değildir.
Size her ne kadar mantıklı gelmese dahi bunun çok geçerli bir sebebi var: Uygulamanın kayıt girer iken yaptığı işlem SQL sunucuya "bu bilgileri kaydet" demektir. Daha detaylı ifade etmek gerekir ise siz TUniQuery1.Post() komutunu verdiğinizde bileşen arka planda yukarıdaki örnek SQL komutuna benzer bir INSERT SQL komutunu oluşturur ve sunucuya gönderir. Aynı anda onlarca veya yüzlerce kullanıcı aynı tabloya kayıt giriyor olabilir. Uygulama SQL sunucu tarafından IDENTITY alanına atanan değeri bilemez. Bunu özellikle sorgulayarak öğrenmesi gerekli.
TUniQuery bileşeni IDENTITY türündeki alanları otomatik olarak algılayabilir. Ayrıca ilgili parametresi (TUniQuery.SpecificOptions.QueryIdentity parametresidir ve standart olarak açıktır) açık olduğu zaman özel SQL komutunu (atanan IDENTITY değerini geri çevirecek SQL komutu) kendisi arka planda sizin için otomatik olarak oluşturur ve SQL sunucu tarafından yeni kayıt için kullanılan değeri okur.
Benim bilgim dahilinde aşağıdaki parametreler UniDAC bileşenleri tarafından FirebirdSQL sunucusuna özel kullanılırlar.
Kod: Tümünü seç
UniQuery1.Options.StrictUpdate := False;
UniQuery1.DMLRefresh:=True;
Aşağıdaki kod ile deneme yaptığımda ID değerini geriye çeviriyor.
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
var
Query: TUniQuery;
begin
Query := TUniQuery.Create(nil);
try
Query.Connection := UniConnection1;
Query.SQL.Text := 'select * from testme';
Query.Open();
Query.Append();
Query.FieldByName('ad').AsString := 'test';
Query.Post();
ShowMessage(Query.FieldByName('autoinc').AsString);
finally
Query.Free();
end;
end;
Yukarıdaki örnek kod ile sizin kodunuz arasındaki farklar anlayabildiğim kadarıyla aşağıdaki gibi:
1- Örnek kod TUniQuery bileşeni içine alan tanımlarını (TUniQuery üzerinde sağ tuş -> Fields Editor...) tasarım zamanında doldurmuyor. Yani alan tanımları TUniQuery1.Open komutu ile bileşen tarafından otomatik olarak dolduruluyor. Dolayısıyla, TUniQuery bileşeni çalışma zamanında autoinc isimli alanın IDENTITY türünde bir alan olduğunu otomatik algılıyor. Bu anlamda sizin Fields Editor içinden "RecId" alanının tanımını kontrol etmenizde fayda var.
2- Örnek kod TUniQuery bileşeninin tüm ayarları standart şekilde iken çalıştırılıyor. Yani TUniQuery.Options veya TUniQuery.DMLRefresh parametreleri hiç değiştirilmiyor.
Eğer siz de örnek kod gibi denediğinizde IDENTITY değerini yine de okuyamıyor iseniz sorunu gösteren örnek tablo yapısı ve örnek proje dosyalarını paylaşmanızda fayda olacaktır.