|
Обработка нарушений параллелизма, допускающая коллизию на уровне строк
// Поиск нарушений параллелизма.
if (custTable.HasErrors)
{
foreach (DataRow row in custTable.GetErrors () )
// Мы можем устранить только ошибки обновления данных
if (row.RowState == DataRowState .Modified)
t
// Создание новой команды UpdateCoimand.
// Новая команда обновления данных будет
// использоваться для устранения ошибок.
// Сохраняем старую команду обновления
// (если она существовала) .
SqlCommand oldUpdateCmd = null;
if {dataAdapter .UpdateCommand != null)
{
oldUpdateCmd = dataAdapter. UpdateCommand;
/I Создание новой команды.
SqlCommand updCmd = conn.CreateCommand! ) ;
// Анализ измененных строк и создание
// нового SQL-оператора.
string updateSQL = "UPDATE CUSTOMER SET ";
string whereSQL = "WHERE ";
SqlParameterCollection updParams = updCmd. Parameters;
for (int x = 0; x < row. iteraArray. Length; ++x)
{
if (row[x, DataRowVers ion. Original] !=
row [x, DataRowVersion. Cur rent] )
{
// Добавление параметров.
DataColumn col = custTable. Columns [x] ;
updParams .Add("@" + col.ColumnName, null);
updParams ["@" + col.ColumnNaroe] . SourceColumn =
col . ColuxnnName ;
Глава 8. Обновление базы данных 195
// Создание объекта CommandBuilder для генерации
// команд вставки, обновления и удаления данных.
SqlCommandBuilder bldr = new SqlComnmndBuilder (dataAdapter) ;
try
(
dataAdapter. Update (custTable) ;
}
catch (DBConcurrencyException ax)
{
// Вывод сообщения о нарушении параллелизма.
Console . WriteLine ( "Concurrency Violation : { 0 } " ,
ex. Message) ;
if (custTable . HasErrors)
{
foreach (DataRow row in custTable. GetErrors ())
{
Console. WriteLine (" Violation Row: (CustomerlD: {0}) ",row["CustomerID"] ) ;
}
}
}
|
В приведенном примере имитируется внесение изменений в базу данных с целью
нарушения параллелизма (изменения вносятся до фактического обновления объекта
Data Table), В результате этого сразу же после попытки обновления таблицы
Customers будет сгенерировано исключение DBConcurrencyException. После такой
неудачной попытки обновления таблицы мы можем проанализировать ее строки и
выявить те из них, которые привели к нарушению параллелизма. В данном примере
мы не стараемся исправить ситуацию, а просто сообшаем о ней пользователю. Поскольку объект DataTable содержит информацию об ошибках, ее можно использовать для фактического решения проблемы, т.е. для того чтобы заставить объект DataAdapter
снова обновить объект DataTable.
По умолчанию объект DataAdapter пытается обновить каждую измененную строку. Когда происходит нарушение параллелизма, он генерирует исключение и прекращает обновление базы данных. Отмены успешно внесенных изменений при этом
не происходит.
Такое поведение объекта может оказаться не тем, которое требуется в конкретной
ситуации. Если установить значение свойства DataAdapter. ContinueUpdateDnError
в true (по умолчанию используется значение false), то объект DataAdapter попытается обновить все строки и отметит те из них, которые привели к нарушению параллелизма. В этом случае после завершения обновления таблицы вам придется вручную
проверить свойство DataTable. HasErrors на наличие информации об ошибках. Если таковые имелись, то в свойстве RowError каждой "сбойной" строки будет содержаться информация об ошибке. Если же ошибок не бьито, то есть основание считать,
что обновление базы данных прошло успешно.
Предыдущая стр.   
Оглавление   
Следующая стр.
Средняя оценка:     (1 - 1 голосов) Для оценки необходимо зарегистрироваться
Только зарегистрировавшиеся пользователи могут оставлять комментарии
|
|