![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавление новой записи - Invalid variant type convertion [D6, IB5.x]
reticon © (2005-07-01 14:21:00)Работаю с таблицей через IBQuery. Если в таблице уже есть хотя бы одна запись, то добавление, редактирование и удаление других новых записей проходит нормально. Если же удалить все записи из таблицы, а потом попытаться довавить новую, то получаем Invalid variant type convertion. Где грабли?
Danilka (2005-07-01 15:43:00) [21]Stakan © (01.07.05 15:31)
> На твое имхо есть мое, которое категорически
> несогласное
Обоснуй чем плоха ХП
Хотя-бы тем, что я (или любой другой воинствующий ламер :) ) могу зайти в твою базу и накуралесить прямыми вставками в таблицу, а предьявлять юзеры будут не мне, а тебе. И ламер воинствующий будет в первых рядах. И прав он будет, кстати.
:)
Danilka (2005-07-01 15:43:00) [22]Stakan © (01.07.05 15:38)
Хм. Неужели в ИБ нет возможности узнать значение после вставки? Какого-нибудь returning?
Stakan (2005-07-01 15:38:00) [23]Sergey13 © (01.07.05 15:34) [13]
А тем что значение ID которое она вернула у тебя под рукой, и ты его можешь использовать. Как правило, в сложных системах после добавления записи требуется выполнить ещё ряд действий с этой записью (например, зарегистрировать добавление). Если программа простая, то можно обойтись и триггером, но лучше везде использовать один подход.
reticon (2005-07-01 15:36:00) [24]понятно, разобрался, спасибо :)
для ID оставлю триггер
Sergey13 (2005-07-01 15:34:00) [25]2[12] Stakan © (01.07.05 15:31)
А чем же она хороша?
(с)
8-)
Stakan (2005-07-01 15:31:00) [26]
> На твое имхо есть мое, которое категорически
> несогласное
Обоснуй чем плоха ХП
Danilka (2005-07-01 15:30:00) [27]Stakan © (01.07.05 15:17)
ИМХО лучше ХП
На твое имхо есть мое, которое категорически несогласное!
msguns (2005-07-01 15:29:00) [28]Если триггер во всех случаях сам вставляет новый ID, на кой его предварительно определять, с помощью ХП или без.
Либо вставить в триггер проверку на NULL, либо не солить соль.
Stakan (2005-07-01 15:17:00) [29]
> ХП нужна просто для получения ID, или можно обойтись
> без нее?
Так ты - же в триггере ID получаешь, оставь что - нибудь одно, ИМХО лучше ХП
Sergey13 (2005-07-01 15:08:00) [30]2 [7] reticon © (01.07.05 15:03)
В таблицу вставится не то что ты получил в процедуре.
reticon (2005-07-01 15:03:00) [31]ХП нужна просто для получения ID, или можно обойтись без нее?
Johnmen (2005-07-01 14:58:00) [32]Занятно. Сам написал и сам не понимаешь что...
Два разА дернуть генератор - это зачем ?
:)))
Sergey13 (2005-07-01 14:58:00) [33]2[3] reticon © (01.07.05 14:45)
>а вот что там максоам ищется и про NULL + 1 я не совсем тебя понял :)
Я просто предположил что новый ИД находится как max(ID)+1. Соответственно на пустой таблице и получишь NULL + 1. Не так, значит мое предположение не верно.
2[4] reticon © (01.07.05 14:48)
А зачем тебе процедура эта? Как она к таблице относится?
reticon (2005-07-01 14:48:00) [34]Тю, кажется нашел в чем причина...
При добавлении записи у меня сначала идет вот что:
IBQuery1.Params[0].asInteger := MainForm.IBStoredProc1.Params[0].asInteger;
где ХП реализована в виде
CREATE PROCEDURE GET_NEW_CD_ID
RETURNS (CD_ID INTEGER)
AS
BEGIN
CD_ID = GEN_ID(CD_ID_GEN, 1);
END;^
Неужели отсюда грабля?
reticon (2005-07-01 14:45:00) [35]да, ID генерится в триггере:
SET TERM ^;
CREATE TRIGGER TBI_CD FOR CD
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
NEW.ID = GEN_ID(CD_ID_GEN, 1);
END;^
а вот что там максоам ищется и про NULL + 1 я не совсем тебя понял :)
Stakan (2005-07-01 14:43:00) [36]Грабли в твоём коде, в том месте где ты добавляешь запись.
Sergey13 (2005-07-01 14:28:00) [37]В тригере (или в проге) наверное новый ИДшник максом ищется. От NULL +1 и дает подобное.