🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#82565
Author: Borneq
Date: Thu, 20 Aug 2015 09:53
23 lines
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
#82566
Author: Tomek D
Date: Thu, 20 Aug 2015 10:16
30 lines
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
#82567
Author: Borneq
Date: Thu, 20 Aug 2015 10:32
13 lines
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
#82568
Author: Tomek D
Date: Thu, 20 Aug 2015 10:42
16 lines
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
#82569
Author: Borneq
Date: Thu, 20 Aug 2015 10:50
8 lines
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