Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2010, 13:56   #1
shurik_klgd
 
Регистрация: 28.09.2010
Сообщений: 6
По умолчанию GENERATOR firebird

Сделал маленькую базу в IBExpert
1.таблица CARDS с полями
CARD_ID integer (primary key)
CARD_POLE varchar(255)
2. создал генератор
CREATE SEQUENCE CARDS_GENERATOR;
3. создал тригер
CREATE TRIGGER CARDS_BI0 FOR CARDS
ACTIVE BEFORE INSERT POSITION 0
AS
begin
NEW.CARD_ID = GEN_ID(CARDS_GENERATOR, 1);
end

Добавляю строку в IBExpert`е в табличку, сохраняю, автоматом проставляется поле CARD_ID, все работает как надо

А вот если в Delphi7 использую TIBDataBase, TIBTransaction, TIBTable,
то
var IBTB:TIBTable;
...
IBTB.Open;
IBTB.Append;
IBTB.FieldByName('CARD_POLE').AsStr ing:='blabla';
IBTB.Post; - ТУТ ОШИБКА, что поле CARD_ID должно иметь значение.

Почему не срабатывает триггер BEFORE INSERT у таблицы CARD?
shurik_klgd вне форума Ответить с цитированием
Старый 29.09.2010, 14:55   #2
shurik_klgd
 
Регистрация: 28.09.2010
Сообщений: 6
По умолчанию

нашел на http://www.sql.ru/forum/actualthread...815&hl=dbaware
Объясните мне раз и на всегда: почему не генерируется автоинкрементное (первичный индекс) поле, если я пытаюсь добавить запись через TIBTable посредством Insert + FieildByName + Post? (при этом естественно через IBQuery INSERT INTO и т.п. все корректно).
ОТВЕТ:
// Для шипко любознательных.

В момент TDataSet.Insert - не производится никакого обращения к серверу (в части выполнения самой команды INSERT). И не должно. Фишка заключается в том, что значение, фактически присвоенное в первичный ключ вставленной записи - имеет право быть узнанным на клиенте только в момент AfterPost (т.е. после фактического выполнения операции INSERT на сервере, но... ! никак не до).

// Для шипко сомневающихся

Вообще то является +- хорошим тоном - автоматически определять (по собственным таблицам эдаких метаданных) - какой таблице какой сиквенс привязан (вернее - для тех таблиц, у которых есть и должен быть сиквенс/генератор - лучше обзывать его синхронно, вроде
MY_TABLE$ и к ней MY_TABLE_GEN. А DataSet это должен понимать, и дергать и присваивать значение сиквенс-генератора с сервера как раз в момент AfterInsert (или BeforeInsert).

А можно и проще, и тупее (т.е. статегически - вообще не вернее) - просто заполнить какое свойство на DataSet-е, типа KeySequence
shurik_klgd вне форума Ответить с цитированием
Старый 29.09.2010, 15:03   #3
shurik_klgd
 
Регистрация: 28.09.2010
Сообщений: 6
По умолчанию

т.е. если удалить тригер, и выполнить
var sql:TIBQuery;
sql.Text:='insert into CARDS(CARD_ID,CARD_POLE) VALUES (GEN_ID(CARDS_GENERATOR, 1), '''blablabla''');
sql.execSQL;
то все добавится
теперь вопрос в другом, как мне получить CARD_ID только что добавленной записи после sql.execsql?
shurik_klgd вне форума Ответить с цитированием
Старый 29.09.2010, 15:20   #4
shurik_klgd
 
Регистрация: 28.09.2010
Сообщений: 6
По умолчанию

select gen_id(CARDS_GENERATOR, 0) from rdb$database

всем спасибо
shurik_klgd вне форума Ответить с цитированием
Старый 29.09.2010, 20:05   #5
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

все это конечно не плохо, а очень плохо
потому что при многопользовательском доступе вы можете получить значение сиквенса от вставки 20й записи после вашей

гарантированно получить тот самый айдишник можно либо через ХП, с помощью которой организовать вставку записи, либо при помощи компонентов, которые умеют его возвращать (например. ФИБ_плюс)
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IPv4 Generator ergil Софт 1 19.07.2010 16:06
из interbase в firebird? Domanoff БД в Delphi 1 18.05.2010 20:23
скорость FireBird Gurt87 БД в Delphi 3 26.01.2010 18:31
FireBird Д'якон БД в Delphi 2 04.12.2008 11:15
FireBird 1.5.4 Nikola__ БД в Delphi 2 17.11.2008 14:42