如何捕获SQL Server存储过程中的错误?

时间:2014-11-04 05:01:22

标签: sql-server-2008 stored-procedures error-handling

我需要捕获错误并将其发送到Web应用程序。例如,以下是我的存储过程:

CREATE PROC ADDNAME
   (@FirstName VARCHAR(10),
    @LastName VARCHAR(10))
AS
BEGIN
    BEGIN TRY
    BEGIN TRAN
       INSERT INTO EMPLOYEE(FirstName, LastName) 
       VALUES (@FirstName, @LastName)
    END TRY
    BEGIN CATCH
       ROLLBACK TRAN
       PRINT @@ERRORMESSAGE
    END CATCH
END

在这里,如何捕获错误并将其发送到Web应用程序?通常,哪种方法可以处理来自Web应用程序的存储过程错误?

我正在使用ASP.NET& C#作为前端。我需要你的建议。

2 个答案:

答案 0 :(得分:2)

首先,您无法在BEGIN CATCH中回滚。不是先检查XACT_STATE()。除非xact_state()为1,否则无法运行ROLLBACK。想想当异常是1205(发生死锁)时的简单情况,在这种情况下,在强制回滚事务之后,你会得到异常。有关混合事务和错误处理的正确模式,请参阅Exception handling and nested transactions

其次,您的存储过程不需要事务和错误处理,因为。除非真正的代码更复杂,否则您的程序不会添加任何值。

最后,要使用RAISERROR()引发错误。 SQL Server 2012还有THROW

答案 1 :(得分:1)

请尝试:SQL中的代码

create procedure sp_err_msg
as begin
    -- RAISERROR with severity 11-19 will cause execution to 
    -- jump to the CATCH block.
    -- better place this inside catch block
    -- RAISERROR ('Error raised in TRY block.', -- Message text.
    --           11, -- Severity.
    --           1 -- State.
    --       );
    raiserror('error message', 11, 1);
end

C#中的代码。只是为了说明如何从SQL中获取错误

public static string GetErrorMessage() 
{
  string errMsg = null;
  try
  {
    using (var con = new SqlConnection(connectionString)) 
    {
      using (var cmd = new SqlCommand("sp_err_msg", con)) 
      {
        cmd.CommandType = CommandType.StoredProcedure;
        con.Open();

        cmd.ExecuteNonQuery();
      }
      con.Close();
    } 
  }
  catch(Exception e) {
    errMsg = e.Message;
  }

  return errMsg;
}