![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавление записей в БД [D6, D7, MSSQL]
Олеся © (2004-10-22 14:50:00)Проблема такая, есть некая таблица Table1, данная таблица связана с Table2, Table3 и т.д., допустим, через ключ id, причем Table2,3 и т.д. являются как бы дочерними таблицами, будем так называть, при вызове функции добавления, появляется форма, в которую пользователь заносит нужные данные, вопрос вот в чем, при одновременном добавлении записей в главную и дочерние таблицы, возникает ошибка, так как без Post первой таблицы не передается ключ id, а если делать Post до добавления в дочернии, то при отмене действия, в главной таблице запись все же остается.
bushmen (2004-10-23 12:59:00) [1]>а еще можешь в качестве id использовать GUID
Ключ будет медленне работать, чем int с identity
dim- (2004-10-23 10:44:00) [2]а еще можешь в качестве id использовать GUID.
при создании записи в главной таблице формируешь GUID, а в дочернии его передаешь.
uses
..ActiveX,ComObj;
Function GetGUID ():ShortString;
var
Guid: TGuid;
strGuid: string;
begin
CoCreateGuid(Guid);
strGuid := GuidToString(Guid);
Delete(strGuid,length(strGuid),1);
Delete(strGuid,1,1);
Result := strGuid;
end;
bushmen (2004-10-22 16:38:00) [3]"SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope."
Олеся (2004-10-22 16:14:00) [4]Спасибо всем за советы, попробую разобраться в транзакциях.
Anatoly Podgoretsky (2004-10-22 16:11:00) [5]Либо запрашиваешь самостоятельно и вставляешь вручную, либо после вставки узнаешь у сервера @IDENTITY
Трансакции позволят вернуть все в исходное состояние, если будет желание отказаться от модификации.
Олеся (2004-10-22 15:59:00) [6]Ega23:А-а, я просто не поняла постановку совета, так у меня на дочерние таблицы и есть ADOQuary, куда передается параметр id, но как я смогу узнать заранее какой id у меня примет главная запись?
DenK_vrtz (2004-10-22 15:52:00) [7]>Ega23 ©
Видел я как-то у одного "маньяка" проект. Из DataSet-ов одни TTable. А потом начинается беготня по while not() do. Душераздирающее зрелище! :)
Johnmen (2004-10-22 15:46:00) [8]Как верно заметил АП, здесь надо вдумчиво изучать и аналогично применять управление транзакциями...
Ega23 (2004-10-22 15:44:00) [9]TADOQuery.
И что-то не верится мне, что "огромнейший проект" построили на ADOTable'ах. Ну редактирование справочных таблиц. Да вот, собственно, и всё. Больше применения - не вижу...
Олеся (2004-10-22 15:42:00) [10]Ega23: а что вы мне предлагаете использовать как замену?аргументируйте пожалуйста, у меня огромнейший проект весь на ADO компонентах, если я из-за исправления одной ошибки, буду все переделывать, мне нужны необходимые для этого аргументации. Да еще при условии, что у меня не возникнут новые проблемы, которые при таком перевороте могут оказаться более значимыми!
Ega23 (2004-10-22 15:38:00) [11]Забудь про TADOTable и будет тебе счастье.
Вредный элемент.
Олеся (2004-10-22 15:37:00) [12]Anatoly Podgorelsky: проходили мы такое, делала для ADOConnection BeginTran, толку было ноль, очень сложно все преобразования уследить, да еще сделать так, чтобы они были в одной транзакции, но может вы подскажете ваш подход?
Олеся (2004-10-22 15:35:00) [13]Sergey32: А как получить значение будущего id, без вставки записи? И притом мне это мало что дает, при вставке в дочернии таблицы я использую append, а не запрос типа insert into (так как подобный запрос при таком количестве таблиц, и записей...), поэтому свой, личный id, вручную я передать не могу.
Ega23: я думала об этом, если честно, но не представляю себе как написать подобную хранимую процедуру, возможно я не полностью осведомлена в этой теме.
Я использую ADOTable.
msguns: я использую DBEhoGrid, и отказаться от него не представляет никакой возможности. Условие должно выполнятся, такое ТЗ.
Anatoly Podgoretsky (2004-10-22 15:35:00) [14]Трансакции
msguns (2004-10-22 15:11:00) [15]Если при вводе надо скакать по окнам (панелям) главной и подчиненных, то следует сразу отказаться от DB-aware контролов, а все впихивать либо в стрингриды (массивы записей), либо, если данных много, использовать клиентские датасеты с промежуточным сохранением на лок.диске.
А вообще мне лично непонятно, откуда такое суровое условие. И почему нельзя ввести до конца заголовок, запостить его, а потом уж заниматься деталями.
Ega23 (2004-10-22 15:00:00) [16]Вообщето обычно сначала заполняют справочные таблицы, а потом подчиненные. Но если ДЕЙСТВИТЕЛЬНО НЕОБХОДИМО добавлять записи во все таблицы сразу, то лучше воспользуйся написанием хранимой процедуры на сервере.
Да, вот ещё что: забудь про TTable.
Ega23 (2004-10-22 15:00:00) [17]Вообщето обычно сначала заполняют справочные таблицы, а потом подчиненные. Но если ДЕЙСТВИТЕЛЬНО НЕОБХОДИМО добавлять записи во все таблицы сразу, то лучше воспользуйся написанием хранимой процедуры на сервере.
Да, вот ещё что: забудь про TTable.
Sergey13 (2004-10-22 14:58:00) [18]Значит надо попробовать получить значение ИД главной таблицы заранее.