private static void HandleOperationException(object sender, OperationExceptionEventArgs ea) { Assert.That(ea, Is.Not.Null); Assert.That(ea.Exception, Is.Not.Null); Assert.That(ea.Exception.Number, Is.Not.Null); Console.WriteLine("Operation: " + ea.Operation); Console.WriteLine("Error number: " + ea.Exception.Number); Console.WriteLine("Exception: " + ea.Exception.GetBaseException().Message); }
/// <summary> /// Обработчик исключительной ситуации, возникшей при работе с базой данных. /// </summary> /// <param name="sender">Источник исключительной ситуации.</param> /// <param name="ea">Экземпляр аргументов <see cref="BLToolkit.Data.OperationExceptionEventArgs"/>, содержащие данные об исключительной информации.</param> void Database_OperationException(object sender, OperationExceptionEventArgs ea) { // sql connection error numbers int[] nums = new int[] { -1, 2, 53, // cann't establish a connection to the server -2, // timeout expired 11, // general network error 233, // transport-level error - no process is on the other end of the pipe 1205 // deadlock resources }; int?num = null; try { num = ea.Exception.Number; } catch { } // workaround for number getter exception Exception ex = ea.Exception.InnerException; string message = ex.Message; Priority priority = Priority.Error; if (ex != null && ex is SqlException) { switch ((ex as SqlException).Number) { case -2: message = Resources.TimeoutExpired_ValidationError; priority = Priority.ExternalError; break; case 2: message = Resources.NotRunningServer_ValidationError; priority = Priority.ExternalError; break; case 17: message = Resources.ServerDBNotExistOrAccessDenied_ValidationError; priority = Priority.ExternalError; break; case 53: message = Resources.ConnectionFailure_ValidationError; priority = Priority.ExternalError; break; case 229: case 230: message = Resources.AccessDenied_ValidationError; priority = Priority.ExternalError; break; case 1205: message = Resources.DeadLockDetected_ValidationError; priority = Priority.ExternalError; break; case 4060: message = Resources.RequestedDataBaseNotAvaliable_ValidationError; priority = Priority.ExternalError; break; case 10054: case 18456: message = Resources.RemoteHostUnreachable_ValidationError; priority = Priority.ExternalError; break; } } // В случае открытия соединения и/или проблемы с сетью обращение к свойству this.Command приводит к рекурсивному исключению if (ea.Operation == OperationType.OpenConnection || (num != null && Array.Exists(nums, n => { return(num == n); }))) { //TODO: посмотреть поле LastQuery - возможно его можно выводить в качестве текста последней команды SqlCommand cmd = new SqlCommand(); cmd.CommandText = this.LastQuery; cmd.Connection = new SqlConnection(_connectionString); throw new DetailedException(message, ex, cmd, priority); } else { // TODO: проверить на разных типах запросов: Ins, Upd, Del, SP... throw new DetailedException(message, ex, this.Command, priority); } }