UpdateBatch. Нужен квалифицированный совет.

debutant
Дата: 16.12.2002 20:38:18
Доброго времени суток!
Уже несколько дней бьюсь с этой проблемой.
Имеется многозвенное приложение. Клиент - IE с DSO, Recordset которого заполняется компонентом, исполняемым в MTS. База - SQL Server 7.0 SP4.
Применен способ пересылки наборов записей между уровнями. Пересылается стока ADO XML Recordset, затем на требуемом уровне она преобразовывается в ADO Recordset и т.д.
Так вот, компонент MTS получает от клиента отредактированный пользователем набор записей и затем выполняет UpdateBatch на БД. Вот тут и возникает проблема: если клиент делал редактирование записей, то возникает сообщение "Cannot update identity column 'DetailsID'. : Microsoft OLE DB Provider for SQL Server", т.е. ADO пытается выполнить UPDATE Detais SET DetailsID=?, MasterID=?, DetailsDescription=? WHERE DetailsID=? на таблицу, где DetailsID указано как identity. Почему? Почему при редактировании записи в IE в элементе управления с datafld/datasrc DSO передает компоненту всю запись, а не поле записи? Самое смешное, что без проблем проходит удаление и добавление записей при пакетном обновлении!
Может кто уже сталкивался с подобной проблемой? Может есть какие-то скрытые свойства этого DSO, которые требуется изменить?

Заранее спасибо
MiCe
Дата: 17.12.2002 10:45:27
надо исключить из редактирования поле с identity property....
тогда ADO не будет его обновлять....
debutant
Дата: 17.12.2002 16:59:24
Спасибо за совет!
А как тогда лучше организовать идентификацию новых записей на клиенте? Неужели передавать на клиена какой-нибудь штамп, например сесии, а затем автоинкрементировать его на клиенте? Или есть еще способ?
Замечу, что всю работу по редактированию записей выполняет код Recordset.UpdateBatch
Блин, если не проходит только UPDATE, а INSERT и DELETE проходят, то может быть следует просто в компоненте доступа к данным проанализировать набор записей, выделить те, у которых adEditInProgress, отключить автоинкремент поля таблицы, сделать UpdateBatch, включить автоинкремент и сделать UpdateBatch остальным записям? Изврат?
MiCe
Дата: 17.12.2002 20:00:28
я говорю исключить из редактирования .... а ни как не из выборки.....
debutant
Дата: 17.12.2002 21:27:34
А можно поподробнее и для тормозов?
Ну исключал я его из редактирования на клиенте (просто не делал привязки элемента управления к этому полю), но он, вредный, все равно в отправляемый набор включался и UPDATE тормозил! Делал так: создавал на клиенте набор записей, а потом его напрявлял его на DataControl.Recordset. Элементы управления привязывал к этому DataControl.
Может объясните как сделать правильно?
Спасибо
debutant
Дата: 18.12.2002 13:06:52
Кажись добрался до сути проблемы. Вся катавасия с набором происходит по вине RDS.DataControl. Минимальная единица, с которой этот элемент может работать - запись. Потому при редактировании даже одного поля записи в клиентском наборе через присоединенные элементы управления на компонент передается вся строка. Если же отказаться от присоединенных элементов управления и автоматического обновления полей записи, а всю работу с записью проводить при помощи кода и на события (типа rst.Fields("DetailsDescriptions")="new"), то на серверный компонент отправляется правильная комбинация!
Я действительно пытался забить гвоздь шляпкой вверх, да еще и лбом :-)
Да... Геморроя теперь с клиентским кодом не избежать... А так прекрасно работалось через привязанные элементы управления!

Всем спасибо!
Пошел дальше биться