Коды ошибок SqlException

У меня есть вопрос, и это не проблема. В моей базе данных есть некоторые ограничения, такие как уникальные имена (столбец, в котором хранится имя чего-то, что должно быть уникальным). При вставке или обновлении БД проверяет, не переопределяем ли мы какое-то имя, и если да, возвращает ошибку, которая может быть преобразована в SqlException с кодом 2627

Мой вопрос: существует ли какая-то таблица или что-то, с чем я могу ознакомиться, чтобы указать конечному пользователю, что делать?

В этом случае... существует пользователь с таким именем....


person gds03    schedule 10.05.2012    source источник


Ответы (3)


Я думаю, вам следует взглянуть на SqlExceptions Ошибки свойство и просмотрите ошибки номер, который должен указывать на сообщение в таблице master.dbo.sysmessages.

person PiRX    schedule 10.05.2012

Не думайте, что определенный код ошибки всегда относится к одной и той же проблеме.

select * from master.dbo.sysmessages where description like '%timeout%' 

Это даст вам все следующие возможные сообщения об ошибках - все с кодом 1033 :

Значение, указанное для тайм-аута, недопустимо. Тайм-аут должен быть допустимым целым числом от 0 до 2 147 483 647. 1033

Тайм-аут ожидания блокировки: класс '%ls', идентификатор %p, тип %d, задача 0x%p : %d, время ожидания %d секунд, флаги 0x%I64x, задача-владелец 0x%p. Продолжаем ждать. 1033

Связь с экземпляром удаленного сервера "%.*ls" не была завершена до истечения времени ожидания. Команда ALTER DATABASE могла быть не выполнена. Повторите команду. 1033

Значение тайм-аута зеркального отображения базы данных %d превышает максимальное значение 32767. 1033 Запись кэша метаданных %d:%d в идентификаторе базы данных (%d) не проверяется на согласованность из-за тайм-аута блокировки. 1033

Отмеченная транзакция "%.*ls" завершилась неудачно. Превышено время ожидания при попытке поставить отметку в журнале, зафиксировав помеченную транзакцию. Это может быть вызвано конфликтом с транзакциями координатора распределенных транзакций Microsoft (MS DTC) или другими 1033

Истекло время ожидания операции массовой вставки целевого объекта SQL Server. Рассмотрите возможность увеличения значения свойства Timeout в пункте назначения SQL Server в потоке данных. 1033

...и многие другие ошибки на всех языках.

Так что можно с уверенностью предположить, что 1033 означает какой-то тайм-аут? К сожалению, даже это неверно:

select description from master.dbo.sysmessages where msglangid=1033

Предупреждение: %S_DATE произошла фатальная ошибка %d. Запишите ошибку и время и обратитесь к системному администратору.

Запрос не разрешен в Waitfor.

Неверный синтаксис рядом с "%.*ls".

%S_MSG, начинающийся с "%.*ls", слишком длинный. Максимальная длина: %d. Элементы ORDER BY должны появиться в списке выбора, если инструкция содержит оператор UNION, INTERSECT или EXCEPT.

Номер позиции ORDER BY %ld выходит за пределы количества элементов в списке выбора.

и многие другие ошибки, не связанные с тайм-аутом.

Итак, я придерживаюсь:

IsSqlTimeout = ((ex as SqlException).Message.ToUpper().Contains("TIMEOUT");

Итак, чтобы на самом деле ответить на ваш вопрос - это зависит от того, что ваш пользователь действительно способен понять или о чем ему нужно рассказать.

Я бы посоветовал вам регистрировать все ошибки (коды и сообщения) за определенный период времени, группировать их и смотреть, какие из них наиболее распространены в вашей среде.

person Simon_Weaver    schedule 11.04.2017
comment
Отсутствует скобка: var IsSqlTimeout = ((например, как SqlException).Message.ToUpper().Contains(TIMEOUT)); - person Kasim Husaini; 09.06.2019

Здесь сообщается значение различных кодов ошибок: https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-events-and-errors?view=sql-server-ver15. Убедитесь, что вы выбрали правильную версию БД слева.

person Sue Maurizio    schedule 11.06.2020