Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Добавление новой записи - Invalid variant type convertion [D6, IB5.x]


Страницы:   1 2

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-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо