![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 28.09.2010
Сообщений: 6
|
![]()
Сделал маленькую базу в 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? |
![]() |
![]() |
![]() |
#2 |
Регистрация: 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 |
![]() |
![]() |
![]() |
#3 |
Регистрация: 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? |
![]() |
![]() |
![]() |
#4 |
Регистрация: 28.09.2010
Сообщений: 6
|
![]()
select gen_id(CARDS_GENERATOR, 0) from rdb$database
всем спасибо ![]() |
![]() |
![]() |
![]() |
#5 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
![]()
все это конечно не плохо, а очень плохо
потому что при многопользовательском доступе вы можете получить значение сиквенса от вставки 20й записи после вашей гарантированно получить тот самый айдишник можно либо через ХП, с помощью которой организовать вставку записи, либо при помощи компонентов, которые умеют его возвращать (например. ФИБ_плюс) |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |