Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.26;
Скачать: CL | DM;

Вниз

Автоинкреаментное поле   Найти похожие ветки 

 
Sinus ©   (2006-09-23 17:33) [0]

Привет всем ,
есть БД ( пример из папки CommonFiles\Borland\data ),
при попытке вставить запись в таблицу "Работников" поле ИД
не заполняю и при сохранении записи генерируется исключение
"Поле ID не заполненно ", если же заполняю - необходимо проверять вводимое значени на отсуствие в таблице.
Вопрос по чему автоматически не генерируется число из  генератора и не вставляется в поле ИД ?


 
Desdechado ©   (2006-09-23 17:39) [1]

читать ibase.ru

ЗЫ генератор - сама по себе сущность
привязка генератора к полю таблицы выполняется триггером, например, BEFORE INSERT


 
Sinus ©   (2006-09-23 17:46) [2]

Генератор уже привязан к поля таблицы  ...
-(


 
Desdechado ©   (2006-09-23 18:04) [3]

повторю - читать ibase.ru

исключение может давать Д, тогда сделай поле в настройках компонентов необязательным или же заполняй его нулем, например
и триггер ACTIVE

и думать больше


 
dr Gonzo ©   (2006-09-25 11:14) [4]

0. Таблица допустим  

Table_1 ( PkId   INT, Field1  INT)
1. Должен присутствовать генератор:

Например создать генератор G_Table_1

2. Присваиваем значение генератора в тригере перед Insert"oм :

CREATE TRIGGER Table_1_BeforePost FOR Table_1
ACTIVE BEFORE INSERT POSITION 0
AS
begin
 IF (NEW.PkId IS NULL) THEN
   NEW.PkId =  GEN_ID(G_Table_1, 1);
end


3. Если нужно получить значение только что сгенерированного значения
генератора то используем:

X = GEN_ID(G_Table_1, 0);


 
Sergey13 ©   (2006-09-25 11:18) [5]

> [4] dr Gonzo ©   (25.09.06 11:14)

> 3. Если нужно получить значение только что сгенерированного
> значения
> генератора то используем:
>
> X = GEN_ID(G_Table_1, 0);

Теоретически можно нарваться на неприятности.


 
dr Gonzo ©   (2006-09-25 12:02) [6]

X = GEN_ID(G_Table_1, 0);

Обычно применяется в транзакции, сразу после вставки, для возвращения ID только что созданной записи. Если есть еще способы прошу поделиться.


 
Sergey13 ©   (2006-09-25 12:04) [7]

> [6] dr Gonzo ©   (25.09.06 12:02)
> Обычно применяется в транзакции, сразу после вставки, для
> возвращения ID только что созданной записи. Если есть еще
> способы прошу поделиться.

Генератор работает ВНЕ контекста транзакции. Поэтому надо получать значение не ПОСЛЕ вставки, а ДО нее, и использовать далее полученное значение.


 
dr Gonzo ©   (2006-09-25 12:18) [8]

тогда правильнее создавать сразу процедуру на вставку, без использования тригера - это если нужно потом получать только что вставленное значение ID.


 
Виталий Панасенко   (2006-09-25 12:44) [9]


> dr Gonzo ©   (25.09.06 12:02) [6]
> X = GEN_ID(G_Table_1, 0);
>
> Обычно применяется в транзакции, сразу после вставки, для
> возвращения ID только что созданной записи. Если есть еще
> способы прошу поделиться.

FireBird 2.0+FIBPLus


 
Sergey13 ©   (2006-09-25 12:52) [10]

> [8] dr Gonzo ©   (25.09.06 12:18)

Правильнее чем что? И в чем принципиальная разница? И что даст отказ от тригера?


 
dr Gonzo ©   (2006-09-25 13:33) [11]

Правильнее сразу в теле процедуры на вставку получать новоре значение генератора (в переменную), записывать его в поле ID и его же возвращать в RETURN_VALUES. Чем использование тригера.


 
Sergey13 ©   (2006-09-25 13:42) [12]

> [11] dr Gonzo ©   (25.09.06 13:33)

Почему не правильнее это делать в клиенте?
Тригер срабатывает всегда, а ХП только когда ее вызовут. Улавливаешь разницу?


 
dr Gonzo ©   (2006-09-25 13:47) [13]

Я лично приверженец того, чтобы Insert Update таблиц был только через хранимые процедуры. При таком подходе в принципе удобнее всего получение ID вставлять как раз в хранимую процедуру на Insert объекта. Хотя можно продублировать и в тригере :)


 
Виталий Панасенко   (2006-09-25 14:10) [14]


> dr Gonzo ©   (25.09.06 13:33) [11]
> Правильнее сразу в теле процедуры на вставку получать новоре
> значение генератора (в переменную), записывать его в поле
> ID и его же возвращать в RETURN_VALUES. Чем использование
> тригера.

А как же "бизнес-логика на сервере"? тригер срабатывает на событие, генерируемой системой (БД). А ХП придется вызывать из приложения.. или опять же - из тригера...


 
Val ©   (2006-09-25 14:21) [15]

>А как же "бизнес-логика на сервере"?...
Вроде как от данного подхода не страдает, даже наоборот, многое, что должно/может сопутствовать вставке в данную табличку, можно красиво зашить в данную хп, получая неделимый для выполнения/отката блок.
...А из триггера айдишничек-то не вернешь...
Ну, впрочем, это давнишний холивар, больше не буду  :)


 
Виталий Панасенко   (2006-09-25 14:32) [16]


> ...А из триггера айдишничек-то не вернешь...
> Ну, впрочем, это давнишний холивар, больше не буду  :)

В ЖарПтице 2 с использоваением FIBPLus - аж бегом ! (ФИБы поддерживают эту возможность "двойки")


 
dr Gonzo ©   (2006-09-25 14:43) [17]

Тут получается размазывания кода в Delphi + SQL = что на мой взгляд глупо.

По идее, возвращаясь к началу темы, у нас должна быть хранимая процедура на сервере вида WorkerAdd (P1,P2,PN) которая возвращает код ошибки и  табельный номер и/или ID созданной записи. А уж потом для этой хранимой процедуры можно создать обертку в виде класса. Это мой личный подход.


 
Desdechado ©   (2006-09-25 17:46) [18]

я предпочитаю получать сгенеренный в триггере ID после успешной вставки записи путем вызова SELECT c уникальной комбинацией полей
тогда никаких коллизий


 
_Ламер_   (2006-09-25 19:05) [19]

А триггер может получить доступ к системным таблицам, если текущий юзер не имеет его? IB/FB, например.



Страницы: 1 вся ветка

Текущий архив: 2006.11.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.037 c
6-1152182640
KLAUS
2006-07-06 14:44
2006.11.26
Ошибка в Webbrowser1


15-1162968761
TIF
2006-11-08 09:52
2006.11.26
Moscow, Bill Gates & Microsoft


2-1162910749
Juri
2006-11-07 17:45
2006.11.26
Indy


2-1163084690
Коля
2006-11-09 18:04
2006.11.26
Программа не дает выключиться Windows


2-1162768751
AlexeyT
2006-11-06 02:19
2006.11.26
ExtractIcon и показ иконки на тулбаре