【问题标题】:To get the Error_Number() from the stored procedure to the calling .NET application将 Error_Number() 从存储过程中获取到调用 .NET 应用程序
【发布时间】:2012-02-12 15:03:31
【问题描述】:

您好,将 Error_Number() 从存储过程传递到调用 .NET 应用程序的最佳方法是什么?

我知道我们可以通过设置输出参数或通过SELECT 查询来做到这一点。

注意:我正在使用数据阅读器。

提前致谢。

【问题讨论】:

    标签: c# exception exception-handling ado.net sqldatareader


    【解决方案1】:

    您可以尝试执行此操作 - 在 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);
        }
    }
    

    【讨论】:

    • 谢谢。我正在使用数据阅读器。此解决方案适用于 Data Reader 吗?
    • @Ananth:如果在 SQL Server 中发生RAISERROR,您的 C# 代码将因异常而中断 - 并且您的数据读取器被中止,并且控制权转到 try/catch 中的 catch阻止您的 .NET 应用程序。所以是的 - 它适用于数据阅读器....
    • @marc_s ..我得到了我正在寻找的答案..它是 ex.Number 有错误号..谢谢..但是引发错误不适用于数据阅读器。 sp 中的选择查询工作正常,尽管 RAISERROR 语句是在 SELECT 查询之后编写的,但从未引发错误
    • 在 catch 块中使用 ROLLBACK TRAN 时如何使用此方法?当我使用 ROLLBACK TRAN 关键字时,aps.net 不会进入异常块
    【解决方案2】:

    试试这个:

    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;
    

    【讨论】:

    • @Royi..谢谢。 .但是我们除了SELECT查询还有其他解决方案吗?就像我需要知道是否将使用错误号设置 commandobject 或 reader 的任何属性。
    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 2011-03-21
    • 2019-08-26
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    相关资源
    最近更新 更多