Thread View: pl.comp.lang.delphi.bazy-danych
5 messages
5 total messages
Started by Borneq
Thu, 20 Aug 2015 09:53
TIBCQuery Insert/Post nie zważa na triggera autoinkremantacji
Author: Borneq
Date: Thu, 20 Aug 2015 09:53
Date: Thu, 20 Aug 2015 09:53
23 lines
1931 bytes
1931 bytes
Najpierw robiłem w następujący sposób:
queryInsert:=TIBCQuery.Create(self);
queryInsert.SQL.Text:='insert into books (title) values (:title);';
queryInsert.ParamByName('title').AsString:=edTitle.Text;
queryInsert.Execute;
queryInsert.Free;
ale aby zobaczyć id_books nowo wstawionego musiałem odczytywać wartość
generatora: select gen_id(gen_books_id, 0) from rdb$database;
Teraz robię w ten sposób, że mam na formie IBCQuery1 podczepione do
grida z zapytaniem "select ID_BOOKS,TITLE from BOOKS"
To samo query używam jednak za pomocą Insert:
IBCQuery1.Insert;
IBCQuery1.FieldByName('title').AsString := edTitle.Text;
IBCQuery1.Post;
aby odczytywać bezpośrednio
id_books := IBCQuery1.FieldByName('id_books').AsInteger;
Jednak jest błąd w IBCQuery1.Post polegający na tym, że id_books jest
puste, choć w bazie ma triggera autoinkrementacji. Prawdopodobnie
jeszcze przed odwołaniem do bazy programowo jest sprawdzane (?), w
każdym razie Insert/Post nie zważa na triggera
Re: TIBCQuery Insert/Post nie zważa na triggera autoinkremantacji
Author: Tomek D
Date: Thu, 20 Aug 2015 10:16
Date: Thu, 20 Aug 2015 10:16
30 lines
2267 bytes
2267 bytes
W dniu 2015-08-20 o 11:53, Borneq pisze:
> Najpierw robiłem w następujący sposób:
> queryInsert:=TIBCQuery.Create(self); queryInsert.SQL.Text:='insert
> into books (title) values (:title);';
> queryInsert.ParamByName('title').AsString:=edTitle.Text;
> queryInsert.Execute; queryInsert.Free;
>
> ale aby zobaczyć id_books nowo wstawionego musiałem odczytywać
> wartość generatora: select gen_id(gen_books_id, 0) from
> rdb$database;
>
> Teraz robię w ten sposób, że mam na formie IBCQuery1 podczepione do
> grida z zapytaniem "select ID_BOOKS,TITLE from BOOKS" To samo query
> używam jednak za pomocą Insert: IBCQuery1.Insert;
> IBCQuery1.FieldByName('title').AsString := edTitle.Text;
> IBCQuery1.Post; aby odczytywać bezpośrednio id_books :=
> IBCQuery1.FieldByName('id_books').AsInteger;
>
> Jednak jest błąd w IBCQuery1.Post polegający na tym, że id_books jest
> puste, choć w bazie ma triggera autoinkrementacji. Prawdopodobnie
> jeszcze przed odwołaniem do bazy programowo jest sprawdzane (?), w
> każdym razie Insert/Post nie zważa na triggera
A skąd ma znać to pole, skoro nadawane jest po stronie bazy?
Możliwości jest kilka:
- pobrać wartość ID ręcznie i podać jego wartość w insert
- skorzystać ze składni insert into table1 (f1) values (:f1) returning
(id) into :id
Tomek D.
Re: TIBCQuery Insert/Post nie zważa na triggera autoinkremantacji
Author: Borneq
Date: Thu, 20 Aug 2015 10:32
Date: Thu, 20 Aug 2015 10:32
13 lines
1533 bytes
1533 bytes
W dniu 20.08.2015 o 12:16, Tomek D pisze: > A skąd ma znać to pole, skoro nadawane jest po stronie bazy? > Możliwości jest kilka: > - pobrać wartość ID ręcznie i podać jego wartość w insert odpada, ta wartość jest ustawiane w triggerze przed samym insert > - skorzystać ze składni insert into table1 (f1) values (:f1) returning > (id) into :id returning (id) rzeczywiście działa, ale nie mogę pobrać za pomocą FIeldByName, może jakoś inaczej? Natomiast gdy chcę wstawić do parametru, jest błąd SQL, mam wersję Firebirda 2.5.
Re: TIBCQuery Insert/Post nie zważa na triggera autoinkremantacji
Author: Tomek D
Date: Thu, 20 Aug 2015 10:42
Date: Thu, 20 Aug 2015 10:42
16 lines
1594 bytes
1594 bytes
W dniu 2015-08-20 o 12:32, Borneq pisze: > W dniu 20.08.2015 o 12:16, Tomek D pisze: >> A skąd ma znać to pole, skoro nadawane jest po stronie bazy? >> Możliwości jest kilka: - pobrać wartość ID ręcznie i podać jego >> wartość w insert > > odpada, ta wartość jest ustawiane w triggerze przed samym insert Jeśli trigger jest dobrze napisany (np. taki jak sugeruje IBExpert) to w niczym nie przeszkadza. A czytałeś w ogóle dokumentację do tych komponentów? 20 sek i proszę https://www.devart.com/ibdac/docs/?auto_key_field_value_gen.htm To rozwiązuje Twoje problemy. Tomek D.
Re: TIBCQuery Insert/Post nie zważa na triggera autoinkremantacji
Author: Borneq
Date: Thu, 20 Aug 2015 10:50
Date: Thu, 20 Aug 2015 10:50
8 lines
1311 bytes
1311 bytes
W dniu 20.08.2015 o 12:42, Tomek D pisze:
> https://www.devart.com/ibdac/docs/?auto_key_field_value_gen.htm
> To rozwiązuje Twoje problemy.
Racja Insert/Post ale w DFM ustawić należało pola:
object IBCQuery1: TIBCQuery
KeyFields = 'id'
KeyGenerator = 'GEN_BOOKS_ID'
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads