我需要捕获错误并将其发送到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#作为前端。我需要你的建议。
答案 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;
}