【问题标题】:Catch error message returned from sql server stored procedure at front end在前端捕获从 sql server 存储过程返回的错误消息
【发布时间】:2011-07-25 05:57:29
【问题描述】:

我正在用以下方式编写存储过程..

CREATE PROCEDURE spTest
@intCompId      int,
@varCompName    varchar(50)
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY 
    INSERT INTO tblCompanyMaster(CompId,CompName)
    VALUES (@intCompId,@varCompName)
    IF(@@ERROR<>0)
        RAISERROR('Error',10,1)
        SELECT ERROR_MESSAGE()

    IF(@@ERROR=0)
    BEGIN
        COMMIT TRANSACTION
        SELECT 0;
    END
    ELSE
        ROLLBACK TRANSACTION
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH
END
GO

在这种情况下,如果发生错误,它将返回错误消息。我用 sqlcommand 属性从前端调用这个 sp,比如 oSqlcommand.executeNonQuery();它将返回受影响的行数,否则返回零。现在我想要的是,如果存储过程中出现任何错误,那么 error_message() 返回的消息应该在前端作为异常捕获,因为我正在将每个异常写入文本文件中。如何在前端捕获此消息? 我的编码风格如下......

try
{

   //Some code

}
catch(exception ex)
{

    //Write exception in text file.

}

我想在 ex. 处处理该消息。

【问题讨论】:

    标签: asp.net sql-server stored-procedures


    【解决方案1】:

    您的存储过程包含一个根本缺陷:

    如果您在检查@@ERROR(或@@ROWCOUNT)的值后执行任何语句,它会被重置为零。

    在继续之前,您应该始终缓存在局部变量中:

    DECLARE @errornum int
    SET @errornum = @@ERROR
    

    如果您还需要行数,那么您必须像这样在单个语句中执行

    SELECT @errornum = @@ERROR, @rowcount = @@ROWCOUNT
    

    另外,你应该不需要混合TRY/CATCH和检查@@ERROR

    当你想处理存储过程中的错误时,你使用TRY/CATCH,例如:

    BEGIN TRY
        -- ...
        -- Do Stuff
        -- ...
    END TRY
    BEGIN CATCH
        SELECT 
            ERROR_NUMBER() AS ErrorNumber
            ,ERROR_MESSAGE() AS ErrorMessage;
    END CATCH
    

    在您的 C# 代码中,捕获 SqlException

    【讨论】:

    • ..我无法理解您的第一句话“您的存储过程包含一个根本缺陷”。此外,我无法通过这个答案得到你想说的意思。能否请您详细说明。我不想在程序中获得行数。我正在使用 Try/Catch 来处理事务并使用 @@ERROR 来获取错误消息。
    猜你喜欢
    • 2017-07-21
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多