Я пытаюсь улучшить обработку ошибок. 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
Особенно сообщение об ошибке и соответствующие «Оператор был прекращен» не в порядке.