这是我的存储过程代码“uspTest”
BEGIN TRY
SELECT 3 / 0;
END TRY
BEGIN CATCH
RAISERROR('D', 16, 3);
END CATCH
这是我在visual studio中的c#代码
public IHttpActionResult RegisterUser(RegisterModelView registerViewModel)
{
try
{
using (AusHerbEntities ctx = new AusHerbEntities())
{
ctx.uspTest();
Console.Write("i am in try block");
}
}
catch (Exception e)
{
Console.Write(e.Message);
}
return Ok();
}
当我运行此代码时,C#代码中的Catch块未被调用,但我希望它被调用,因为存储过程会引发错误。
如何才能使此代码生效?
我只想在存储过程中的catch块中执行RAISERROR并捕获c#代码中的错误。
答案 0 :(得分:0)
要使SqlException
抛出,存储过程必须返回@@error
设置。在您的情况下,END CATCH
语句会清除@@error
。在RETURN
语句后立即插入RAISERROR
语句应该使SqlException
抛出。
BEGIN TRY
SELECT 3 / 0;
END TRY
BEGIN CATCH
RAISERROR('D', 16, 3);
RETURN;
END CATCH
答案 1 :(得分:0)
你需要SQL中的try-catch吗?如果您只是用它来回滚事务,那么您只需设置XACT_ABORT并省去try-catch。该事务将被回滚,任何错误都将传递给客户端。这是一篇关于这个主题的好文章:https://www.simple-talk.com/sql/t-sql-programming/defensive-error-handling/
答案 2 :(得分:-1)
无法查看所有c#代码但替换; catch(例外e) 同 catch(SqlException e)