Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Сообщение об ошибке


Автор: Vit 9.2.2006, 17:23
Отловил я @@Error, хочу получить нормальное сообщение обошибке. Как? В справке написано что описание взять в sysmessages, там описание конечно есть, но не полное, типа:

Цитата
Must declare the variable '%.*ls'.


или

Цитата
The %S_MSG '%.*ls' is out of the range of computer representation (%d bytes).


А как из него получить сообщение с подставленными правильными сообщениями?

Автор: boevik 9.2.2006, 21:55
Занимался я этой проблемой, но так и не нашел решения.
Пока удовлетворяюсь номером ошибки.

Если найдешь, что либо стоящее - поделись.

Автор: SergeBS 10.2.2006, 13:37
Vit
А откуда ловишь? ODBC/ADO/...?

Автор: Vit 10.2.2006, 13:50
Из самого сервера

Автор: SergeBS 10.2.2006, 15:56
Vit
Все равно не понял. Из Query Analyserа, что ли? Пример какой-нибудь есть?

Автор: Vit 14.2.2006, 16:03
Например нужна такая SP:

Код

Create procedure SureExec
@sql varchar(8000)
As
begin
  Declare @Error int
  Exec(@sql)
  Set @error=@@error
  if @Error=0
    Insert into MyLogTable (Result) Values ('Operation was completed successfully') 
  else
    Insert into MyLogTable (Result) Values ('Operation was faled with the error message:'+
{Вот тут что писать?})                                                                                         

end

Автор: SergeBS 16.2.2006, 19:57
Vit,
По-моему, ничего. Это уже дело провайдера - получить ошибку и строку ее объясняющую.

BOL:
Цитата

Handling Errors and Messages in Applications
Errors raised either by Microsoft® SQL Server™ or the RAISERROR statement are not part of a result set. Errors are returned to applications through an error handling mechanism separate from the processing of result sets.

Each database API has some set of functions, interfaces, methods, objects or structures through which they return errors and messages. Each API function or method typically returns a status code indicating the success of that operation. If the status is anything other than success, the application can call the error functions, methods, or objects to retrieve the error information.
...
Applications using APIs such as ADO and OLE DB cannot generally distinguish between errors and messages. In ODBC applications, messages generate a SQL_SUCCESS_WITH_INFO function return code, and errors usually generate a SQL_ERROR return code. The difference is most pronounced in DB-Library, in which errors are returned to the application error handler function, and messages are returned to the application message handler function.

ODBC Error Handling
The ODBC specification introduced an error model that has served as the foundation of the error models of the generic database APIs such as ADO, OLE DB, and the APIs built over ODBC (RDO, DAO, and the MFC Database Classes). In the ODBC model, errors have the following attributes:
...
SQLSTATE
The SQLSTATE is a five-character error code defined originally in the ODBC specification. SQLSTATEs are common across all ODBC drivers and provide a way for applications to code basic error handling without testing for all the various error codes returned by various databases. The ODBC SQLSTATE has nothing to do with the state attribute of SQL Server error messages.

ODBC 2.x returns one set of SQLSTATE codes, and ODBC 3.x returns a set of SQLSTATE codes aligned with the X/Open Data Management: Structured Query Language (SQL), version 2 standard. Because all ODBC drivers return the same sets of SQLSTATE codes, applications basing their error handling on SQLSTATE codes are more portable.

Native error number
The native error number is the error number from the underlying database. ODBC applications receive the SQL Server error numbers as native error numbers.

Error message string
The error message is returned in the error message string parameter.

When an ODBC function returns a status other than SQL_SUCCESS, the application can call SQLGetDiagRec to get the error information. For example, if an ODBC application gets a syntax error (SQL Server error number 170), SQLGetDiagRec returns:

szSqlState = 42000, pfNative = 170

szErrorMsg =

'[Microsoft][ODBC SQL Server Driver][SQL Server]

                                    Line 1: Incorrect syntax near *'

 

The ODBC SQLGetDiagField function allows ODBC drivers to specify driver-specific diagnostic fields in the diagnostic records returned by the driver. The SQL Server ODBC driver specifies driver-specific fields to hold SQL Server error information such as the SQL Server severity and state codes.

For more information about retrieving error messages in ODBC applications, see Handling Errors and Messages.

ADO Error Handling
ADO uses an Errors object and Errors collection to return standard error information such as SQLSTATE, native error number, and the error message string. These are the same as their ODBC counterparts. ADO does not support any provider-specific error interfaces, so SQL Server-specific error information such as the severity or state are available to ADO applications.

For more information about retrieving error messages in ADO applications, see Errors Collection and Error Object.

Для ADO:
Код


procedure TForm1.Button1Click(Sender: TObject);
var
    Ret_val,
    i : integer;
    s : string;
begin
  ADOCommand1.Parameters.Clear;
  ADOcommand1.CommandText := 'update inval'#13#10+'set data_uch = ''abcd'' ';
  ADOcommand1.Execute;
  Ret_val  := ADOcommand1.Parameters.ParamByName('RETURN_VALUE').Value;
  for i := 0 to ADOconnection1.Errors.Count - 1 do
  begin
    s := Format('failed with code %d Number %d and Message %s ',
        [Ret_val,
        ADOconnection1.Errors[i].Number,
        ADOconnection1.Errors[i].Description]);
    showmessage(s);
  end;
end;

вернет
syntax error converting character string to smalldatetime data type

Строка точь в точь как от QA
Кинь пример SP, возвращающей код ошибки (чтобы ошибалась). Воткну и посмотрю что вернет. Фантазии не хватает.

Автор: Vit 16.2.2006, 23:44
В том то и дело что никакой клиентской программы нет, есть набор SP, есть навороченная конфигурация процессов засунутая в десяток таблиц, и автоматический вызов процессов в MS SQL Agent... Всё это работает вполне успешно без каких-либо клиентских приложений, но если случаются ошибки то надо бы отловить нормальное описание и сохранить в таблице. Уж не знаю как запускает запросы MS SQL Agent... наверное используя то же OLE DB, но как повлиять на этот процесс не имею ни малейшего понятия...

Автор: SergeBS 17.2.2006, 10:09
Vit,
http://www.osp.ru/win2000/2002/05/046.htm
Посмотри. В этот журнал можно писать откуда хочешь. Больше пока ничего в голову не приходит. На работе авральчик.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)