![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавление новой записи - Invalid variant type convertion [D6, IB5.x]
reticon © (2005-07-01 14:21:00)Работаю с таблицей через IBQuery. Если в таблице уже есть хотя бы одна запись, то добавление, редактирование и удаление других новых записей проходит нормально. Если же удалить все записи из таблицы, а потом попытаться довавить новую, то получаем Invalid variant type convertion. Где грабли?
reticon (2005-07-01 17:32:00) [1]да ладно вам хваит спорить, здесь все написано
http://www.ibase.ru/devinfo/generator.htm:)
Кстати на данную статью наткнулся еще давно, прочитал, вроде разобрался сразу, а счас "доразбираться" пришлось :)
ЗЫ кстати, тригеры ил ХП в моем случае разницы нет, сейчас реализовано на ХП. Эррор выскакивал есессно по глупости - была для отладки вставлена строчка перед добавлением записи в параметр запроса переменную IParam := MainForm.DataSource1.DataSet.FieldByName('ID').Value на что и была ругань при пустом датасете :)
Val (2005-07-01 17:27:00) [2]Да оба варианта нормальны и применимы. В той же процедуре можно будет избежать мутации, например, если при вставке нужно анализировать текущую таблицу.
evvcom (2005-07-01 17:23:00) [3]Хорошо. Тогда про централизованную генерацию ключей. Триггер, куда более централизованней. А с ХП. Писать отдельно, зачем? Если в общей куче с другими действиями, тогда такой вариант, если вдруг надо вставить в таблицу данные из нескольких мест, везде спец. ХП вызывать? Куда лучше триггер. Все имхо.
Val (2005-07-01 17:17:00) [4]Вцепились вы в "молодого разработчика". Существует понятие корпоративных стандартов. По ним и работают - не знает, так нарушит не только вставку. Не аргумент это все-таки, по-моему.
evvcom (2005-07-01 17:13:00) [5]Да, да... Был такой спор.
Я тоже за триггера. Тот же молодой разработчик может сделать вставку и не через ХП, а триггер случайно не обойдешь. Да и сам я при тестировании зачастую вставляю данные напрямую в таблицу. Мне так удобнее.
Danilka (2005-07-01 16:48:00) [6]Stakan © (01.07.05 16:42)
Danilka © (01.07.05 16:37) [28]
Короче оба варианта имеют право на жизнь ;)
> Впрочем, что-то мне это напоминает..
Что?
Спор здесь на форуме, правда не с тобой, на тему вьюхи vs ХП.
:)
Danilka (2005-07-01 16:48:00) [7]Val © (01.07.05 16:38)
>[26] Danilka © (01.07.05 16:30)
Я имел ввиду что без разницы, если вы делаете инсерт в самой хп:
1) достанете ли вы .NextVal в процедуре прямо перед вставкой и во вставке будете использовать лок. переменную;
2) либо возвратите его после вставки в эту же переменную с помощью returning.
Но это оффтоп. Сорри.
Когда есть три десятка разработчиков, хоть и маловероятна, но все-же имеет место быть такая ситуация, когда какой-нибудь молодой, которому из своей задачи есть надобность заполнять какой-то справочник, и он, не увидев триггера на таблице этого справочника втупую будет инсертить с ид равном select max(id)+1 ...
Сейчас, правда, у нас в конторе собираются "поделить" все объекты БД на разработчиков, где у каждого объекта будет известен ответственный, правда для решения других проблем, но и эта станет еще менее вероятная, но все-же..
Stakan (2005-07-01 16:42:00) [8]Danilka © (01.07.05 16:37) [28]
Короче оба варианта имеют право на жизнь ;)
> Впрочем, что-то мне это напоминает..
Что?
Val (2005-07-01 16:38:00) [9]>[26] Danilka © (01.07.05 16:30)
Я имел ввиду что без разницы, если вы делаете инсерт в самой хп:
1) достанете ли вы .NextVal в процедуре прямо перед вставкой и во вставке будете использовать лок. переменную;
2) либо возвратите его после вставки в эту же переменную с помощью returning.
Но это оффтоп. Сорри.
Danilka (2005-07-01 16:37:00) [10]Stakan © (01.07.05 16:31)
evvcom © (01.07.05 16:24) [24]
Именно :) Ещё раз оговорюсь, речь идёт именно о больших системах (несколко тысяч таблиц в БД).
Все действия с таблицами осуществляются через сложные ХП, на которые у юзеров есть права на выполнение, а самих таблдиц они даже не видят (для отображения используются представления).
Если программка небольшая (десяток таблиц, никаких сложных обработок), то подойдут и триггеры.
Они и в твоем варианте подойдут. :)
Тем более, что работаешь с вьюхами - чем плох вариант с instead of триггерами?
Впрочем, что-то мне это напоминает..
:)
Но для орокла, на мой скромный взгляд, все-таки вариант с тригером на таблице предпочтительнее, а в ХП или триггере на вьюхе делать инсерт в таблицу с ретурнингом.
Stakan (2005-07-01 16:31:00) [11]evvcom © (01.07.05 16:24) [24]
Именно :) Ещё раз оговорюсь, речь идёт именно о большихсистемах (несколко тысяч таблиц в БД).
Все действия с таблицами осуществляются через сложные ХП, на которые у юзеров есть права на выполнение, а самих таблдиц они даже не видят (для отображения используются представления).
Если программка небольшая (десяток таблиц, никаких сложных обработок), то подойдут и триггеры.
Danilka (2005-07-01 16:30:00) [12]Stakan © (01.07.05 16:16)
ИМХО неудачный подход, вставка первичных ключей должна делаться централизовано, единообразно.
На мой взгляд, вполне достаточно централизованного генератора. :) И для ИБ вариант, когда есть и триггер и ХП вполне жизнеспособен. "Я так думаю." :)
Val © (01.07.05 16:25)
почему бы и нет, если там же insert происходит :)
А в Орокле нет проблем с вытаскиванием ИД после инсерта в таблицу, так шта, плюсов у вариантов с ХП там нет. :)
Val (2005-07-01 16:25:00) [13]почему бы и нет, если там же insert происходит :)
evvcom (2005-07-01 16:24:00) [14]
> Я тоже последнее время всё больше по Ораклу
И в Оракле тоже ключи в ХП генеришь? :)
Stakan (2005-07-01 16:16:00) [15]Danilka © (01.07.05 15:59) [20]
> Есть еще одна проблема - когда у тебя несколько сот
> таблиц и еще больше ХП разобраться новому человеку (да
> может и тебе самому, через какое-то время) будет
> довольно сложно. А с триггером - проще
Если система большая, то пользуются спец. средствами.
> Далее, для "Как правило, в сложных системах после
> добавления записи требуется выполнить ещё ряд действий
> с этой записью (например, зарегистрировать
> добавление)" можно использовать тот-же самый триггер.
Согласен, не не всегда.
> Если-же требуется именно на клиенте узнавать ИД
>вставленной записи, то это тоже решаемо.:)
> Я-бы тогда использовал триггер, но немного не такой: в
> триггере проверял-бы - если вставляемое значение ИД -
> NULL, то генерим новое, если что-то другое, то
> вставляем его. А уж где дернут генератор - на клиенте
> отдельным запросом, или еще и ХП оставить - дело
> десятое. :)
ИМХО неудачный подход, вставка первичных ключей должна делаться централизовано, единообразно.
> Кажись, именно так в ИБ обычно и делаецца, эх
> давненько с ним не работал.
Я тоже последнее время всё больше по Ораклу ;)
Danilka (2005-07-01 16:03:00) [16]сорри за [21] обкатываю клиента форума от Ломброзо. :)
Danilka (2005-07-01 15:59:00) [17]Stakan © (01.07.05 15:31)
> На твое имхо есть мое, которое категорически
> несогласное
Обоснуй чем плоха ХП
Хотя-бы тем, что я (или любой другой воинствующий ламер :) ) могу зайти в твою базу и накуралесить прямыми вставками в таблицу, а предьявлять юзеры будут не мне, а тебе. И ламер воинствующий будет в первых рядах. И прав он будет, кстати.
:)
Danilka (2005-07-01 15:59:00) [18]Sergey13 © (01.07.05 15:45)
Понятно. Очень жаль. :)
Stakan © (01.07.05 15:48)
Есть еще одна проблема - когда у тебя несколько сот таблиц и еще больше ХП разобраться новому человеку (да может и тебе самому, через какое-то время) будет довольно сложно. А с триггером - проще.
Далее, для "Как правило, в сложных системах после добавления записи требуется выполнить ещё ряд действий с этой записью (например, зарегистрировать добавление)" можно использовать тот-же самый триггер.
Если-же требуется именно на клиенте узнавать ИД вставленной записи, то это тоже решаемо.:)
Я-бы тогда использовал триггер, но немного не такой: в триггере проверял-бы - если вставляемое значение ИД - NULL, то генерим новое, если что-то другое, то вставляем его. А уж где дернут генератор - на клиенте отдельным запросом, или еще и ХП оставить - дело десятое. :)
Кажись, именно так в ИБ обычно и делаецца, эх давненько с ним не работал.
Stakan (2005-07-01 15:48:00) [19]Danilka © (01.07.05 15:43) [17]
Я уже говорил, что случаи бывают разные :)
> Хотя-бы тем, что я (или любой другой воинствующий
> ламер :) ) могу зайти в твою базу и накуралесить
> прямыми вставками в таблицу, а предьявлять юзеры будут
> не мне, а тебе. И ламер воинствующий будет в первых
>рядах. И прав он будет, кстати.
> :)
А на этот случай есть разграничения прав доступа.
Sergey13 (2005-07-01 15:45:00) [20]2[15] Stakan © (01.07.05 15:38)
А я тоже самое могу и без ХП сделать? И что?
2 [16] Danilka © (01.07.05 15:43)
Нет вроде.
2[17] Danilka © (01.07.05 15:43)
Воинствующие ламеры победят и накуролесят по любому. 8-)