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

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

Добавление записей в БД [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]

Значит надо попробовать получить значение ИД главной таблицы заранее.


Наверх

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