2009-09-21 2 views
4

Я использую Delphi 2007 с ADO для доступа к базе данных SQL Server 2008.Получение ошибок ADO с помощью Delphi

Хранимая процедура в базе данных превалирует ввод и если проверка не выполняется, она возвращает набор результатов ошибок (содержащий информацию об ошибках). Используя SQL Server Management Studio, когда я запускаю хранимую процедуру, я получаю собственный результат обработки ошибок на одной вкладке и собственное сообщение об ошибке в другом.

В моем приложении Delphi, когда я открываю хранимую процедуру, я могу получить доступ к настраиваемому набору ошибок. Однако объект Errors в ADO-соединении не содержит встроенной ошибки.

Как получить доступ к объекту коллекции Errors, чтобы я мог предоставить дополнительную информацию о причине ошибки?

Thanks

ответ

4

Вариант 1) с использованием коллекции ошибок подключения ADO.

try 
.... 
.... 
.... 
ADOQuery1.Open;//Execute your sql statement 
except 
    LastErrorIndex :=ADOConnection1.Errors.Count-1; 
    SourceError  :=ADOConnection1.Errors.Item[LastErrorIndex].Source; 
    NumberError  :=ADOConnection1.Errors.Item[LastErrorIndex].Number; 
    DescriptionError:=ADOConnection1.Errors.Item[LastErrorIndex].Description; 
    SQLStateError :=ADOConnection1.Errors.Item[LastErrorIndex].SQLState; 
    NativeError  :=ADOConnection1.Errors.Item[LastErrorIndex].NativeError; 
end; 

Вариант 2) Вы можете использовать @@ переменные ошибок, чтобы получить последнюю ошибку от сервера SQL.

select @@error 

При возникновении ошибки в Sql Server, все вы можете получить номер ошибки, используя глобальную переменную @@ ERROR. Для получения описания ошибки нет глобальной переменной @@ ERROR_MESSAGE. Для полного сообщения об ошибке, вы можете запросить таблицу master..sysmessages используя номер ошибки:

SELECT Description FROM master..sysmessages WHERE error= @@ERROR AND msglangid=1033 

, но большинство из этих сообщений имеют заполнители (например,% с,% Ld), вы также можете использовать это Stored Procedure.

вы можете прочитать эту статью Error Handling in SQL Server – a Background для получения дополнительной информации.

До свидания.

+1

Вместо '.sql.clear' и' .sql.add', вы можете просто сказать '.sql.text: =' –

+0

Спасибо RRUZ. Я думаю, что проблема заключается в том, что с помощью ADO вы можете либо получить набор результатов, и/или возвращаемое значение, либо необработанную ошибку на сервере, которая возвращается как внутренняя ошибка ADO. Я попрошу наш dba еще раз взглянуть и решить, как мы вернем ошибку. – 2009-09-22 03:45:35

+0

Хороший момент Мейсон! – 2009-09-22 03:46:05

Смежные вопросы