Мудрец
Зарегистрирован: 29 September 2002
Сообщения: 1479
Примеры кода: 5
|
RE[2]: Связь один ко многим в одной талице ... |
28 May 2003 15:17 |
|
|
|
|
Имеем таблицу следующей структуры Id (bigint, PKey, autoincrement), ParentId(bigint), Nm(varchar(300)). На клиенте dataset и winforms TreeView. Проблемой является каскадное удаление групп. На стороне MS SQL 2000 данная связь не позволяет проводить каскадное удаление, тогда как в датасет это возможно. Соответственно при Update возникает exception.
Вопрос 1. Каким образом задать порядок обновления строк Адаптером, или это возможно сделать только построчным обновлением с использование рекурсии (первым удаляем строку, Id которой не засветился в ParentId)?
Вопрос 2. Кто нибуть встречал примеры решений от MSDN или производителей компонент?
тогда как в датасет это возможно. Соответственно при Update возникает exception.
Это точно?
Вопрос 1. Каким образом задать порядок обновления строк Адаптером, или это возможно сделать только построчным обновлением с использование рекурсии (первым удаляем строку, Id которой не засветился в ParentId)?
Могу только предложить такой извращённый вариант:
0. Перед всем этим извратом, который я напишу ниже, данные в датасете и базе надо синхронизировать.
1. На стороне клиента перед тем как удалить строку dataRow, клонируешь её в некую cloneDataRow.
1.2. Удаляешь строку dataRow (срабатывает каскад, удаляются все дети)
1.3. Делаешь AcceptChanges для всей таблицы1.4. Добавляешь cloneDataRow в таблицу,
1.5. Делаешь для cloneDataRow AcceptChanges.
1.6. Удаляешь cloneDataRow из таблицы (Delete, а не Remove)
1.7. Обновляешь данные на сервере БД.
2. На стороне БД при помощи INSTEAD OF триггера удаляешь все дочерние строки родительской строки, ну и её соответственно.
Общий смысл понятен? Фактически надо выполнить одну и туже работу на клиенте и на сервере. Клиент при обновлении БД передаёт якобы всего одну удалённую строку и сервер удаляет все соответствующие дочерние строки.
P.S. Где то у меня вертится мыслишка, что это всё как то поизящнее можно сделать, но оформить пока не могу. Если что - напишу
Вариант2:
0. - то же самое
1. Удаляешь строку dataRow (срабатывает каскад, удаляются все дети)
2. Отключаешь нужную ForeignKey Constraint на сервере.
3. Обновляешь данные на сервере БД.
4. Включаешь нужную ForeignKey Constraint на сервере.
Dream Theater: Train of Thought
|
|