c# - 在 DbUpdateException 中获取触发器的名称或错误信息

标签 c# .net sql-server entity-framework

我在数据库中有几个触发器,根据某些情况,它们可能会抛出错误并回滚事务

问题是,在 catch block 中,我将收到一个 DbUpdateException,它不包含有关错误原因的任何信息,并且内部异常不会也没有任何有意义的错误消息。

当我使用 Entity Framework 时,如何获取错误消息或触发器名称?我需要这样做才能向用户显示友好的消息。

第二个内部异常是 SqlException,但将其转换为 SqlException 无济于事,因为 Procedure 是一个空字符串。

(e?.InnerException?.InnerException as System.Data.SqlClient.SqlException).Procedure

最佳答案

要获取触发器名称,您需要将其包含在错误消息中。下面是样板代码示例。

CREATE TRIGGER TR_YourTable ON dbo.YourTable
FOR INSERT, UPDATE, DELETE AS
BEGIN TRY
    --do something;
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage nvarchar(2000) = 
        'Error occurred in trigger ' + OBJECT_NAME(@@PROCID) + ':' + ERROR_MESSAGE();
    RAISERROR(@ErrorMessage,16,1);
END CATCH;
GO

关于c# - 在 DbUpdateException 中获取触发器的名称或错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39136645/

相关文章:

c# - MongoDB InsertBatch JObject - 序列化错误

c# - 使用任务更新 GUI

sql-server - 帮助了解索引上的多个列?

c# - 从字符串数组中随机选择,不重复

C# 通过句柄 (hWnd) 32 位和 64 位获取路径/文件名

c# - 在 Visual Studio 中将应用程序移动到另一台计算机时复制数据库文件

sql-server - sp_executesql 中的命名参数

sql - 如何在SQL中添加动态列?

c# - RegisterStartupScript 和 RegisterClientScriptBlock 哪个更快?

c# - 如何使用触摸板 gearVR