c# - Catch 块不在存储过程中执行
问题描述
我有一个应该从数据库中删除模式的存储过程。我从后端执行这个存储过程(使用 C#)。结果,如果删除成功与否,我想接收布尔值。
var result = await session.Sp<bool>(c => c.spDeleteSchemaTotally, new { schemaName})
.SingleAsync()
.ConfigureAwait(false);
if (result)
{
tracer.Info("Deleted successfully");
}
else
{
tracer.Warn("Schema was not deleted appropriately");
}
存储过程:
ALTER PROCEDURE [dbo].[spDeleteSchemaTotally]
(@schemaName NVARCHAR(100))
AS
SET FMTONLY OFF
BEGIN TRY
UPDATE SchemaList
SET [Status] = 2 /* DELETING */
WHERE SchemaName = @schemaName
EXEC [dbo].[spDeleteSchema] @schemaName
EXEC [dbo].[spDeleteSchemaOwner] @schemaName
EXEC [dbo].[spDeleteSchemaUserRoles] @schemaName
UPDATE SchemaList
SET [Status] = 1 /* DELETED */,
SchemaName = SchemaName + '|deleted|' + FORMAT(GETUTCDATE(), 'MM-d-yyyy-hh:mm')
WHERE SchemaName = @schemaName
SELECT CAST(1 AS BIT);
END TRY
BEGIN CATCH
UPDATE SchemaList
SET [Status] = 3 /* ERRORED */
WHERE SchemaName = @schemaName
SELECT CAST(0 AS BIT);
END CATCH
我有一个表,其中存储了所有模式的列表。对于每个模式,我都有一些状态。每个模式都有一些自己的表、规则等。
但是由于某些原因,我注意到(有时)发生了一些错误,并且模式留下了状态 2(正在删除)。什么样的错误 - 我不知道,因为无法抓住这一刻。
逻辑上认为,存储过程内部发生了一些错误,但为此,我有 catch 块。根据这个主题,一些内部存储过程中的错误应该由外部捕获处理。所以我认为一切都以正确的方式编写......但不正确的行为仍然存在。
有人可以指出我在上述存储过程中处理错误的正确方法吗?
我正在使用 SQL Server。
解决方案
如果每个内部存储过程都具有 Try-Catch 构造,则需要将 THROW 命令添加到每个内部 SP 的 Catch 块中。
它将向外部 SP 抛出错误,您将能够对其进行跟踪。
这个想法是,如果内部 SP 发生错误并带有 Try-Catch 块,则外部 SP 不会失败并且不知道有错误。
推荐阅读
- postgresql - 以 LEFT JOIN PostgreSQL 为条件
- hive - 将镶木地板文件从 Hive 复制到 Vertica 的时间戳问题
- javascript - 如何在 Express 中定义路由参数用冒号分隔的路由?
- json - 如何在序列化期间忽略类的受保护只读成员
- java - 我正在写一个字幕阅读应用程序。我希望它的运行方式与玩家的运行方式相似,但是我正在为时间安排而苦苦挣扎
- javascript - 如何使用 JavaScript 向后端发送非常长的文本?
- c# - 如何在不使用删除对话框 mvc C# 的情况下删除项目表单列表
- javascript - 如何让 Google Apps 脚本 doPost() 读取我的 POST 请求?
- php - 如何发送带附件的聊天消息?
- reactjs - 当用户停止输入时在 React 中执行函数