Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Return ID okuma
#1
merhaba;

yeni yazmaya başladığım program da firebird 3.0 ve IBDAC kullanıyorum.
insert işlemi yaparken RETURNING ID ifadesini SQL kodu içinde kullanarak  en son eklenen kaydın ID sini alabiliyordum.
Firebird 3.0 IDENTITY özelliğini ID alan için kullandım. RETURN ID ile insert işlemi yaparken şu hatayı alıyorum. 'SQL statement doesnt return rows'

     with Dm.QryInserting do
     begin
       Close;
       SQL.Clear;
       SQL.Add('INSERT INTO TBLBIRIMLER (BIRIMADI,BIRIMKODU,SAVEUSER)');
       SQL.Add(' VALUES (:BIRIMADI,:BIRIMKODU,:SAVEUSER) RETURNING ID');
       ParamByName('BIRIMADI').AsString   :=Trim(txtBirimAdi.Text);
       ParamByName('BIRIMKODU').AsString  :=Trim(txtBirimKodu.Text);
       ParamByName('SAVEUSER').AsString   :=KullaniciADI;
       OPEN;
     end;
     EdtKayitID.Text :=Trim(IntToStr(Dm.QryInsertingID.AsInteger));


identity değerini kayıt ekleme esnasında okuyabilmek için ne yapabilirim.
WWW
Cevapla
#2
(22-12-2019, Saat: 17:26)akuyumcu63 Adlı Kullanıcıdan Alıntı: merhaba;

yeni yazmaya başladığım program da firebird 3.0 ve IBDAC kullanıyorum.
insert işlemi yaparken RETURNING ID ifadesini SQL kodu içinde kullanarak  en son eklenen kaydın ID sini alabiliyordum.
Firebird 3.0 IDENTITY özelliğini ID alan için kullandım. RETURN ID ile insert işlemi yaparken şu hatayı alıyorum. 'SQL statement doesnt return rows'

     with Dm.QryInserting do
     begin
       Close;
       SQL.Clear;
       SQL.Add('INSERT INTO TBLBIRIMLER (BIRIMADI,BIRIMKODU,SAVEUSER)');
       SQL.Add(' VALUES (:BIRIMADI,:BIRIMKODU,:SAVEUSER) RETURNING ID');
       ParamByName('BIRIMADI').AsString   :=Trim(txtBirimAdi.Text);
       ParamByName('BIRIMKODU').AsString  :=Trim(txtBirimKodu.Text);
       ParamByName('SAVEUSER').AsString   :=KullaniciADI;
       OPEN;
     end;
     EdtKayitID.Text :=Trim(IntToStr(Dm.QryInsertingID.AsInteger));


identity değerini kayıt ekleme esnasında okuyabilmek için ne yapabilirim.

Merhabalar,

Aşağıdaki link'i inceleyin lütfen.

https://stackoverflow.com/questions/7574...rning-into

Kolay gelsin.
Amaç, bilginin de/aklın da zekat'ını vermek.
Cevapla
#3
UniDAC için bir örnek vereyim belki yardımcı olur. Aynı veritabanı türü.

procedure Txunit.cariEkle(out cariIDout: Integer);
begin
startTranstaction(uniMainModule.QryModuleSQLProcess); ///hazır fonksiyon transtaction için
  with uniMainModule.QryModuleSQLProcess do
  begin
    try
      Close;
      SQL.Clear;
      SQL.Text := 'INSERT INTO CARILER(CR_NO, CR_TC_KIMLIK, ..........) VALUES(:CR_NO, :CR_TC_KIMLIK ..........) RETURNING ID';
      ParamByName('CR_NO').AsString := UpperCase(CariNo);
      ParamByName('CR_TC_KIMLIK').Value := CariTCKimlik;
      ExecSQL;
      Connection.CommitRetaining;
      cariIDout := ParamByName('RET_ID').AsInteger; /// RET_ prefixi ile insertten dönen ID'yi alıyoruz. ID veritabanındaki alanına adi. Eğer DoktorID olsaydı 'RET_DoktorID' denilirdi.
    except
      on E: Exception do
      begin
        Connection.RollbackRetaining;
        ... //// loglamalar ve hata mesajları
      end;
   end;
end;


İyi çalışmalar.
Yazılım Topluluğumuz -> Tıklayın
Kişisel Tanıtım Sitem -> Tıklayın
20 y/o, sadece öğrenmeye odaklanmış, insancık..
WWW
Cevapla
#4
   TRY
     if not Dm.IBCTransSorgu.active then Dm.IBCTransSorgu.StartTransaction;
     with Dm.QryInserting do
     begin
       Close;
       SQL.Clear;
       SQL.Add('INSERT INTO TBLBIRIMLER(BIRIMADI,BIRIMKODU,SAVEUSER)');
       SQL.Add('VALUES(:BIRIMADI,:BIRIMKODU,:SAVEUSER) RETURNING ID');
       ParamByName('BIRIMADI').AsString   :=Trim(txtBirimAdi.Text);
       ParamByName('BIRIMKODU').AsString  :=Trim(txtBirimKodu.Text);
       ParamByName('SAVEUSER').AsString   :=KullaniciADI;
       ExecSQL;
     end;
     if Dm.IBCTransSorgu.active then
     begin
       Dm.IBCTransSorgu.CommitRetaining;
       EdtKayitID.EditValue :=Dm.QryInserting.ParamByName('RET_ID').AsInteger;
       frmAnaForm.Kaydedildi();
     end;
   EXCEPT
     Dm.IBCTransSorgu.RollbackRetaining;
     frmAnaForm.Kaydedilmedi();
   END;

bu şekilde son ID alınıyor. bir sıkıntı görünmüyor. ancak bu yapı birden fazla ilişkili tablolara kayıt yapılırken sıkıntılı gibi görünüyor. oralara gelince bakarız artık. 

çok teşekkür ederim.

bu şekilde tam oldu bence

   TRY
     if not Dm.IBCTransSorgu.active then Dm.IBCTransSorgu.StartTransaction;
     with Dm.QryInserting do
     begin
       Close;
       SQL.Clear;
       SQL.Add('INSERT INTO TBLBIRIMLER(BIRIMADI,BIRIMKODU,SAVEUSER)');
       SQL.Add('VALUES(:BIRIMADI,:BIRIMKODU,:SAVEUSER) RETURNING ID');
       ParamByName('BIRIMADI').AsString   :=Trim(txtBirimAdi.Text);
       ParamByName('BIRIMKODU').AsString  :=Trim(txtBirimKodu.Text);
       ParamByName('SAVEUSER').AsString   :=KullaniciADI;
       ExecSQL;
       EdtKayitID.EditValue :=Dm.QryInserting.ParamByName('RET_ID').AsInteger;
     end;
     if Dm.IBCTransSorgu.active then
     begin
       Dm.IBCTransSorgu.CommitRetaining;
       frmAnaForm.Kaydedildi();
     end;
   EXCEPT
     Dm.IBCTransSorgu.RollbackRetaining;
     frmAnaForm.Kaydedilmedi();
   END;
iyi akşamlar.
WWW
Cevapla
#5
(22-12-2019, Saat: 21:49)akuyumcu63 Adlı Kullanıcıdan Alıntı:
   TRY
     if not Dm.IBCTransSorgu.active then Dm.IBCTransSorgu.StartTransaction;
     with Dm.QryInserting do
     begin
       Close;
       SQL.Clear;
       SQL.Add('INSERT INTO TBLBIRIMLER(BIRIMADI,BIRIMKODU,SAVEUSER)');
       SQL.Add('VALUES(:BIRIMADI,:BIRIMKODU,:SAVEUSER) RETURNING ID');
       ParamByName('BIRIMADI').AsString   :=Trim(txtBirimAdi.Text);
       ParamByName('BIRIMKODU').AsString  :=Trim(txtBirimKodu.Text);
       ParamByName('SAVEUSER').AsString   :=KullaniciADI;
       ExecSQL;
     end;
     if Dm.IBCTransSorgu.active then
     begin
       Dm.IBCTransSorgu.CommitRetaining;
       EdtKayitID.EditValue :=Dm.QryInserting.ParamByName('RET_ID').AsInteger;
       frmAnaForm.Kaydedildi();
     end;
   EXCEPT
     Dm.IBCTransSorgu.RollbackRetaining;
     frmAnaForm.Kaydedilmedi();
   END;

bu şekilde son ID alınıyor. bir sıkıntı görünmüyor. ancak bu yapı birden fazla ilişkili tablolara kayıt yapılırken sıkıntılı gibi görünüyor. oralara gelince bakarız artık. 

çok teşekkür ederim.

Merhaba,
bu tip işlemler için iş katmanı oluşturulmalı. Her tablo eylemi için bir sınıf oluşturulması gerektiğini düşünüyorum. Böylelikle ilişkili tablolarda veri ekleme, silme, güncelleme gibi işlemler daha kontrollü olacaktır. Örneğin a, b, c adında 3 tablonuz var ve birbiri ile ilişkili olduğu için A tablosuna kayıt eklendiğinde A tablosunun ID değeri B tablosuna, B tablosunun ID değeri ise C tablosuna eklenmesi gerektiğini düşünelim;


var 
 tableAId, tableBId: Integer;
 begin
   ///a tablosuna ait property değerleri
   tableA.KayitEkle(tableA); // out parametre tipi ile ID alınmış.
   
   ///b tablosuna ait property değerleri
   tableB.ATableID := tableA; /// Burada B tablosunda bulunan A tablosunun ID değerini tanımlıyoruz.
   ///b tablosuna ait property değerleri
   tableB.KayitEkle(tableB);

   ///c tablosuna ait property değerleri
   tableC.BTableID := tableB; /// Burada C tablosunda bulunan B tablosunun ID değerini tanımlıyoruz.
   ///c tablosuna ait property değerleri
   tableC.KayitEkle;
 end;


İyi çalışmalar.
Yazılım Topluluğumuz -> Tıklayın
Kişisel Tanıtım Sitem -> Tıklayın
20 y/o, sadece öğrenmeye odaklanmış, insancık..
WWW
Cevapla
#6
Hocam Insert, Delete,update, execproc gibi sonuç döndürmeyen ifadeleri kullandığınız da OPEN ile değil, Execsql yada execute ile işlemlerinizi gerçekleştirin.
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#7
delphi mssql kullanımında bu şekilde yeni id alınabiliyor.

insert into tablo () values () select SCOPE_IDENTITY()
......
yeniid := Fields[0].AsInteger;
Cevapla
#8
(23-12-2019, Saat: 14:39)mcuyan Adlı Kullanıcıdan Alıntı: Hocam Insert, Delete,update, execproc gibi sonuç döndürmeyen ifadeleri kullandığınız da OPEN ile değil, Execsql yada execute ile işlemlerinizi gerçekleştirin.

benim merak ettiğim ExecSql işlemi sonrası "SCOPE_IDENTITY()" gibi komutlarda çalıştırılan o andaki sorgu için mi elde edilir yoksa o tabloya kayıt edilen son kaydın numarasını verir ?

Mesala ben aşağıdaki gibi bir kod yazsam bu durumda ne olur 
q1.Close;
q1.Sql.Text := 'Insert Into (...) values () select SCOPE_IDENTITY();
q1.ExecSql;

SON Numara nasıl alınacak

----------
YADA
-----------

q1.Close;
q1.Sql.Text := 'Insert Into (...) values ()';
q1.ExecSql;

q1.Close.
q1.Sql.Text := 'select SCOPE_IDENTITY()';
q1.Open;

Yaparsam nasıl bir durum oluşur
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#9
Microsoft SQL serverde aşağıdaki şekilde kullanıyorum;

   TMP_.Close;
   TMP_.SQL.Clear;
  TMP_.SQL.Add('INSERT INTO INFO_TERM_TMP (PRGID) VALUES ('+QuotedStr(PrgID)+')');
  TMP_.ExecSQL;
  TMP_.Close;
  TMP_.SQL.Clear;
  TMP_.SQL.Add('SELECT scope_identity() AS SONUC');
  TMP_.Open;
  KayitID := TMP_.FieldValues['SONUC'];
Cevapla
#10
(23-12-2019, Saat: 17:13)m_ekici Adlı Kullanıcıdan Alıntı: Microsoft SQL serverde aşağıdaki şekilde kullanıyorum;

   TMP_.Close;
   TMP_.SQL.Clear;
  TMP_.SQL.Add('INSERT INTO INFO_TERM_TMP (PRGID) VALUES ('+QuotedStr(PrgID)+')');
  TMP_.ExecSQL;
  TMP_.Close;
  TMP_.SQL.Clear;
  TMP_.SQL.Add('SELECT scope_identity() AS SONUC');
  TMP_.Open;
  KayitID := TMP_.FieldValues['SONUC'];

Aşağıdaki şekilde olursa aynı anda hem insert işlemini yapmış hemde sonucu döndürmüş olmazmı? yoksa kaçırdığımız bir şey olabilirmi ?
   
  TMP_.Close;
  TMP_.SQL.Clear;
  TMP_.SQL.Add('INSERT INTO INFO_TERM_TMP (PRGID) VALUES ('+QuotedStr(PrgID)+')');
  TMP_.SQL.Add(' SELECT scope_identity() AS SONUC');
  TMP_.Open;
  KayitID := TMP_.FieldValues['SONUC'];
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Güncellenen Kayıt Sayısını Okuma akuyumcu63 1 465 13-12-2019, Saat: 13:42
Son Yorum: akuyumcu63



Konuyu Okuyanlar: 1 Ziyaretçi