|
Использование локальных транзакций для обновления базы данных
Что произойдет, если при выполнении кода из предыдущего примера случится
ошибка? Останется ли база данных в непротиворечивом состоянии? Да, если для связывания операций обновления будут использованы локальные транзакции. Локальные
транзакции позволяют провести отмену внесенных в базу данных изменений в случае
возникновения ошибки на стороне клиента.
// Определение переменной для упрощения доступа к таблице.
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 голосов) Для оценки необходимо зарегистрироваться
Только зарегистрировавшиеся пользователи могут оставлять комментарии
|
|