【发布时间】:2012-02-12 15:03:31
【问题描述】:
您好,将 Error_Number() 从存储过程传递到调用 .NET 应用程序的最佳方法是什么?
我知道我们可以通过设置输出参数或通过SELECT 查询来做到这一点。
注意:我正在使用数据阅读器。
提前致谢。
【问题讨论】:
标签: c# exception exception-handling ado.net sqldatareader
您好,将 Error_Number() 从存储过程传递到调用 .NET 应用程序的最佳方法是什么?
我知道我们可以通过设置输出参数或通过SELECT 查询来做到这一点。
注意:我正在使用数据阅读器。
提前致谢。
【问题讨论】:
标签: c# exception exception-handling ado.net sqldatareader
您可以尝试执行此操作 - 在 SQL try/catch 块中捕获您的 Error_number(),然后引发错误,您可以在 .NET 应用程序中将其捕获为 SqlException。
在您的 SQL 存储过程中:
BEGIN TRY
-- do something here....
END TRY
BEGIN CATCH
DECLARE @ErrorNumber INT
SELECT @ErrorNumber = ERROR_NUMBER()
RAISERROR
(N'The error code is: %d',
16, -- Severity.
1, -- State.
@ErrorNumber, -- First substitution argument.
''); -- Second substitution argument.
END CATCH;
在您的 .NET 代码中(此处为 C#):
// call your stored proc some way...
using(SqlConnection conn = new SqlConnection("server=.;database=Test;Integrated Security=SSPI;"))
using (SqlCommand cmd = new SqlCommand("dbo.YourStoredProcNameHere", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
// possibly add parameters to the stored procedure call....
try
{
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
catch (SqlException ex)
{
// catch SqlException - ex.ErrorNumber contains your error number
string msg = string.Format("Error number: {0} / Message: {1}", ex.Number, ex.Message);
}
}
【讨论】:
RAISERROR,您的 C# 代码将因异常而中断 - 并且您的数据读取器被中止,并且控制权转到 try/catch 中的 catch阻止您的 .NET 应用程序。所以是的 - 它适用于数据阅读器....
试试这个:
BEGIN TRY
-- Generate a constraint violation error.
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
【讨论】: