Как получить SQL сообщений сервера в том же порядке, что и Management Studio? - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь улучшить обработку ошибок. MSDN показывает пример того, как обрабатывать SqlException и SqlException.Errors Property. Я построил хранимую процедуру на SQL сервере, которая генерирует некоторый вывод. Эта процедура вызывается из приложения. NET с обработкой ошибок, подобной MSDN.

Однако порядок сообщений отличается от SQL Server Management Studio. Как получить SqlException.Errors в том же порядке, что и Management Studio?

Хранимая процедура:

CREATE PROCEDURE [dbo].[___PROVOKE_ERRORS]
AS
BEGIN
    SET NOCOUNT ON;
    SET LANGUAGE ENGLISH;

    declare @tab table(id int, word varchar(10))
    declare @id int;

    set @id = (select top(1) object_id from sys.objects)
    print 'Check-ID #1: ' + cast(@id as varchar(10))

    insert into @tab (id, word) values (0, 'test')
    insert into @tab (id, word) values (1, '1234567890abcdef')

    set @id = (select top(1) object_id from sys.objects order by name)
    print 'Check-ID #2: ' + cast(@id as varchar(10))

    insert into @tab (id, word) values (10000000000, 'test')
    
    set @id = (select top(1) object_id from sys.objects order by object_id desc)
    print 'Check-ID #3: ' + cast(@id as varchar(10))

    select * from @tab
END

C# Код для вызова процедуры с обработкой ошибок:

public static void Test()
{
    try
    {
        using (SqlConnection con = new SqlConnection(Properties.Settings.Default.TestConnection))
        {
            con.Open();
            using (SqlCommand cmd = new SqlCommand("___PROVOKE_ERRORS", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.ExecuteNonQuery();
            }
            con.Close();
        }
    }
    catch (SqlException ex)
    {
        DisplaySqlErrors(ex);
    }
}

private static void DisplaySqlErrors(SqlException exception)
{
    for (int i = 0; i < exception.Errors.Count; i++)
    {
        Console.WriteLine("Index #{0} - {1}", i, exception.Errors[i].ToString());
    }
}

Сообщения при вызове процедуры в Management Studio:

Check-ID #1: 3
Msg 8152, Level 16, State 30, Procedure ___PROVOKE_ERRORS, Line 15 [Batch Start Line 0]
String or binary data would be truncated.
The statement has been terminated.
Check-ID #2: 1044210445
Msg 8115, Level 16, State 2, Procedure ___PROVOKE_ERRORS, Line 20 [Batch Start Line 0]
Arithmetic overflow error converting expression to data type int.
The statement has been terminated.
Check-ID #3: 2146991621

Сообщения при вызове процедуры в. NET приложении:

Index #0 - System.Data.SqlClient.SqlError: String or binary data would be truncated.
Index #1 - System.Data.SqlClient.SqlError: Arithmetic overflow error converting expression to data type int.
Index #2 - System.Data.SqlClient.SqlError: Check-ID #1: 3
Index #3 - System.Data.SqlClient.SqlError: The statement has been terminated.
Index #4 - System.Data.SqlClient.SqlError: Check-ID #2: 1044210445
Index #5 - System.Data.SqlClient.SqlError: The statement has been terminated.
Index #6 - System.Data.SqlClient.SqlError: Check-ID #3: 2146991621

Особенно сообщение об ошибке и соответствующие «Оператор был прекращен» не в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...