Поиск
 

ADO.NET

Работа с базами данных в приложениях .NET

Cи Шарп это просто Simple C#
Логин Пароль Вход Регистрация
Главная
Изучаем C#
Web-приложения
Win-приложения
Web-сервисы
ADO.NET
FrameWork
Алгоритмы
Исходники
Классы
Среда разработки
Статьи
Форум
FAQ
О Проекте
Обратная связь
Отблагодарить
Rambler's Top100

Использование локальных транзакций для обновления базы данных

Что произойдет, если при выполнении кода из предыдущего примера случится
ошибка? Останется ли база данных в непротиворечивом состоянии? Да, если для связывания операций обновления будут использованы локальные транзакции. Локальные
транзакции позволяют провести отмену внесенных в базу данных изменений в случае
возникновения ошибки на стороне клиента.



// Определение переменной для упрощения доступа к таблице.
DataTable custTable = dataSet.Tables["Customers"];
DataTable invTable = dataSet.Tables["Invoices"];
// Определение отношения между таблицами.
DataColumn custCustlDColumn =
custTable.Columns["CustomerlD"];
DataColumn invCustlDColumn = invTable.Columns["CustomerlD"];
dataSet.Relations.Add("rel", custCustlDColumn,invCustlDColumn, true};
// Добавление сведений о новом клиенте.
DataRow newRow = custTable.NewRowO;
newRow,BeginEdit(};
newRow["CustomerlD"] = Guid.NewGuid();
newRow["LastName"] = "Remlinger";
newRow["FirstName"] = "Mike";
newRow["Address"] = "10 Aaron Way";
newRow["City"] = "Atlanta";
newRowf'State"] = "GA";
newRow["Zip"] = "30307";
newRow["HomePhone"] = "(404) 543-8T65";
newRow.EndEdit();
custTable.Rows.Add(newRow);
// Изменение сведений о клиенте.
DataRow oldRow = custTable.Rows[0];
oldRow["Address"] = "53 Peachtree Center";
oldRow["Zip"] = "30342";
// Изменение информации о счете.
DataRow oldlnv = oldRow.GetChildRows ("rel") [0] ;
oldlnvf'Terms"] = "Net 10th";
invDA.UpdatefinvTable);
custDA.Update(custTable);
}
catch {SqlException ex)
{
  Console.WriteLine("Sql Error: {0}", ex.Message);
}



Легко заметить, что приведенный выше код напоминает код обновления базы данных на основе объекта DataSet с одной таблицей. Разница заключается в том, что для каждой таблицы создается собственный объект DataAdapter и CommandBuilder.
Порядок вызова метода DataAdapter. Update (} очень важен. Как видите, сначала мы обновляем строки в дочерней таблице. Это связано с тем, что проводится удаление клиента, а определенное отношение DataRelation поддерживает каскадные удаления.
Следует отметить, что если каскадные удаления поддерживаются как базой данных,
так и объектом DataSet, то при обновлении базы данных могут возникнуть ошибки,
связанные с тем, что объект DataSet попытается удалить дочерние элементы, которые
уже были удалены базой данных при удалении родительских строк. Обновление "в
обратном порядке" (начиная с родительской таблицы) позволяет обойти эту проблему, однако вызывает дополнительные трудности при добавлении новых родительских и дочерних строк. Дело в том, что если сначала будет обновляться дочерняя таблица,
имеющая ограничения по внешнему ключу, то добавление новых дочерних строк будет требовать наличия соответствующих строк в родительской таблице. Выходом из этой ситуации является отдельное обновление, вставка и удаление информации из базы данных.

Предыдущая стр.    Оглавление    Следующая стр.
Средняя оценка: (0 - 0 голосов)
Для оценки необходимо зарегистрироваться


Только зарегистрировавшиеся пользователи могут оставлять комментарии



  • Эротическое белье: sex shop.