Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обновление двух связанных таблиц 
:(
    Опции темы
reloni
Дата 21.12.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 10.5.2006
Где: Москва

Репутация: нет
Всего: 4



Приветствую всех.
Пишу программу, которая работает с двумя таблицами, связанными отношением. Есть главная таблица Base, вторая таблица Details. Возник вопрос, как правильно их обновлять. Так, например, если мы добавляем запись в таблицу Base, потом пару дочерних записей в таблицу Details, а затем запускаем вот такое обновление:
Код

this.test3DataSet.EnforceConstraints = false;
this.baseTableAdapter.Update(this.test3DataSet.Base);
this.detailsTableAdapter.Update(this.test3DataSet.Details);
this.test3DataSet.EnforceConstraints = true;

То все данные в БД сохраняются отлично. С обновлением такой метод тоже работает на ура. Но вот если мы удалим запись из родительской таблицы, то т.к. у дата сета стоит каскадное удаление, он удалит все дочерние записи и если теперь запустить тот же самый код, то вылезет исключение: «Concurrency violation: the DeleteCommand affected 0 of the expected 1 records». Поэтому, в случае удаления родительской записи приходится сначала выдергивать удаленные записи из таблицы Details и обновлять базу:
Код

DetailsTable deletedDetails = (DetailsTable)this.test3DataSet.Details.GetChanges(DataRowState.Deleted);

if (deletedDetails != null)
{
    this.detailsTableAdapter.Update(deletedDetails);
}

Затем тоже самое для таблицы Base, тогда удаление записей проходит без ошибок. Ничего умнее придумать не удалось, может есть более нормальный способ это сделать?

Второй вопрос – как ко всему этому прикрутить транзакции? Т.к. сгенерированные студией адаптеры не дают возможности добраться до команд, единственное, что смог придумать – использовать класс TransactionScope:
Код

using (TransactionScope scope = new TransactionScope())
{
    try
    {
        this.baseTableAdapter.Update(this.test3DataSet.Base);            
        this.detailsTableAdapter.Update(this.test3DataSet.Details);
        scope.Complete();
        this.test3DataSet.AcceptChanges();    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}


Но подозреваю, что это тоже не лучший вариант.
PM MAIL ICQ   Вверх
thomas
Дата 21.12.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



reloni
а что это значит?
Цитата

«Concurrency violation: the DeleteCommand affected 0 of the expected 1 records».

У меня такое же исключение только с UpdateCommand, когда я пытаюсь обновить не одну, а две строки в таблице.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
reloni
Дата 21.12.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 10.5.2006
Где: Москва

Репутация: нет
Всего: 4



Это значит, что под действие команды не попала ни одна строка в БД. Если проще, то команда не нашла строку, для которой выполнить обновление (удаление и т.д.).
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.