* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Обработка ошибок при обновлении базы данных
8 февраля 2009
Причины ошибок, возникающих при обновлении данных, бывают самыми разны- ми: вставка записи с дублирующимся значением первичного ключа, попытка моди- фикации строк, используемых другим клиентом и т.д. Разрабатывая код для обнов- ления строк, необходимо предусмотреть любые ошибки и подготовиться к устране- нию их последствий.
Объекты Sql DataAdapters и OledbDataAdapters поддерживают событие RowUpdated, которое генерируется между попыткой обновления строки и любыми возникающи- ми при этом исключениями. В его обработчик можно поместить код, способный обработать любые ошибки, возникающие при обновлении, не вовлекая в этот про- цесс блоки обработки исключений, которые используют много ресурсов. В зависимости от типа применяемого объекта DataAdapter, событие RowUpdated передает экземпляр класса SqiRow Updated EventArgs или leDbRowUpdatedEventArgs. Ар- гументы события RowUpdated позволяют определить, какая ошибка возникла и как ее обрабатывать. В таблице 6-4 описаны некоторые свойства классов SqlRowUpdated- EventArgs и OleDb RowUpdated EventArgs. Таблица 6-4. Свойства класса RowVpdatedEventArgs Имя Описание Command Представляет команду, исполняемую при обноапении строки Errors Возвращает любые ошибки, генерируемые провайдером данных при исполнении этой команды RecordsAffected Возвращает число записей, измененных при исполнении команды, которая задана свойством Command Row Возвращает обновленную строку Status Возвращает значение свойства UpdateStatus объекта команды Чтобы во время обработки события RowUpdated определить, произошла ли ошиб- ка, проверьте свойство Status объекта аргументов события. Это свойство может при- нимать следующие четыре значения: • Continue — объект DataAdapter продолжит обработку строк. Если ошибки не воз- никают, свойство Status сохраняет это значение; • ErrorsOccurred — при попытке обновления данной строки возникла одна или не- сколько ошибок; • SkipAllRemainingRows — при обновлении текущую строку и все остальные следу- ет пропустить; • SkipCurrentRow — при обновлении следует пропустить только текущую строку. При возникновении ошибки свойство Status получает значение Errors Occurred, Обработчик событий RowUpdated позволяет обработать возникшую ошибку, изме- нив значение свойства Status. Если свойство Status установлено в SkipCurrentRow, при обновлении объект DataAdapter пропустит строку, вызвавшую ошибку, и пе- рейдет к другим строкам. Если же свойство Status установлено в SkipAllRemaining- Rows, DataAdapter прекратит обновление. Если Status^ Continue, объект DataAdapter игнорирует ошибку и продолжает обновление. Имейте в виду, что в зависимости от типа источника данных, это может привести к получению непредсказуемых резуль- татов. Если свойство Status сохраняет значение ErrorsOccurred, генерируется исклю- чение, которое передается обработчику исключений приложения. Сведения о возникшей ошибке получают с помощью свойства Errors, которое возвращает объект исключения, представляющий возникшую ошибку. Выбор способа обработки ошибок, возникающих при обновлении БД, опреде- ляется главным образом особенностями приложения. В одних случаях исключения лучше передавать для обработки коду приложения, а в других — использовать для этого обработчик события RowUpdated. Следующий пример иллюстрирует простую схему обработки ошибок обновления с помощью события Rowllpdated объекта SqlData Adapter. Visual Basic .NET Private Sub myDataAdapter_RowUpdated(ByVal sender As Object, ByVal e As System.Data.SqlClient.SqlRowUpdatedEventArgs) Handles myDataAdaoter.RowUpdated Проверить свойство Status объектов аргументов события на наличие ошибок. If e.Status = UpdateStatus.ErrorsOccurred then 1 Уведомить пользователя об ошибке и предоставить ее описание. MessageBox.Show("An error of type " & e. Errors.ToStringO & "occurred. Here is some additional information: " & e,Errors.Message) Пропустить данную строку при обновлении, e.Status - UpdateStatus.SkipCurrentRow End If End Sub Visual C# private void myDataAdapter__RowUpda:ed(object sender, System.Data.SqlClient.SqlflowUpdatedEventArgs e} { // Проверить свойство Status объектов аргументов события на наличие ошибок. if (e.Status == UpdateStatus.ErrorsOccurred) { // Уведомить пользователя об ошибке и // предоставить ее описание. MessageBox.Show("An error of type " + e. Errors.ToStringO + "occurred. Hero is some additional information: " + e.Errors.Message); // Пропустить данную строку при обновлении, e.Status = UpdateStatus.SkipCjrrentRow: