![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема вычитки identity полей из БД [D7, MSSQL]
Roter © (2005-01-04 12:59:00)При использовании трёхуровневой архитектуры есть проблема вычитки значений identity полей из таблици при вставке новых записей.
например: существует ClientDataSet с Provider'ом, который привязан к ADOQuery с запросом "select ID, NAME from Table1" (поле ID имеет тип Identity). Когда я через ClientDataSet вставляю новую запись и делаю ApplyUpdates, которая завершается успешно, значение в поле "ID" остаётся неизветным. Если проредактировать ету запись, появляется сообщение о ошибке в роде "Record not found ...".
Свойство UpdateMode у Provider'а имеет значение upWhereKeyOnly. Поле ID на ADOQuery имеет значение ключа (ProviderFlags = pfInKey).
Как обеспечить вычитку значения поля Identity в этой ситуации из БД, для последующего использования?
Roter (2005-01-04 15:31:00) [1]Спасибо за вразумильтельный ответ! Помощь оказалась полезной!
Nikolay M. (2005-01-04 14:24:00) [2]
> Roter (04.01.05 13:59) [2]
> И где мне делать этот запрос?
Это уже второй вопрос. Первый был - "как?" :-)
Выполнять нужно в том же коннекте, в котором был выполнен INSERT. Вставлять можно так: у ключевого поля убрать флаг pfInUpdate, сразу после инсерта в, например, CDS.AfterInsert вызвать свой метод сервера, названный, например, CDS.AppServer.GetLastIdentity (надеюсь, что он делает, писать не нужно) и присвоить его ключевому полю:
CDSID.AsInteger := CDS.AppServer.GetLastIdentity;
Но я лично стараюсь единообразно делать так, чтобы значение ID было известно на клиенте ДО непосредственной вставки в таблицу на сервере, т.к. иногда есть необходимость в одной транзакции вставить записи в подчиненные таблицы. Вариант, как это можно сделать, описан тут:
http://rsdn.ru/article/db/midas_migration.xml#EDHA
Roter (2005-01-04 13:59:00) [3]И где мне делать этот запрос?
Может есть какието универсальные методы? Ведь если использовать этот метод "SELECT @@IDENTITY" нужно будет писать какието обработчики на какихто событиях? при етом для каждого нового DataSet'а ... и как это вставлять в TClientDataSet?
Nikolay M. (2005-01-04 13:27:00) [4]
SELECT @@IDENTITY
?