从前端的sql server存储过程返回的Catch错误消息

时间:2011-07-25 05:57:30

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

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

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。

处理该消息

1 个答案:

答案 0 :(得分:6)

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

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

在继续之前,您应始终缓存在本地变量中:

DECLARE @errornum int
SET @errornum = @@ERROR

如果您还需要rowcount,那么您必须在单个语句中执行,如此

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