在.net应用程序中忽略T-SQL触发器的错误

本文关键字:T-SQL 触发器 错误 net 应用程序 | 更新日期: 2023-09-27 18:01:18

我有一个TableAdapter,我正在调用适配器的Update(DataSet dataset)函数。底层表上有一个触发器,正在抛出一个错误,但这个错误不会在选择语句之后的应用程序中引起异常,但如果我只是在触发器开始时引发它,则会引起异常。什么好主意吗?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[trigger1] 
   ON  [dbo].[table1]
   AFTER INSERT, UPDATE
AS
SET NOCOUNT ON;
SELECT a.description
FROM table1 a
INNER JOIN table2 b ON b.b_id = a.b_id
INNER JOIN inserted i ON i.b_id = a.b_id AND i.a_id = a.a_id
WHERE a.code = i.code
AND b.b_id <> i.b_id
AND a.description <> i.description
AND b.code IN (SELECT code FROM b WHERE b_id = i.b_id)
IF (@@ROWCOUNT > 0)
BEGIN
    RAISERROR ('ERROR', 16, 1)
    ROLLBACK TRAN
    RETURN
END
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO 

在.net应用程序中忽略T-SQL触发器的错误

看起来您正在检查@@ROW_COUNT以测试是否存在冲突行。也许一个EXISTS查询可以满足您的需求:

IF EXISTS (
    SELECT a.description
    FROM table1 a
    INNER JOIN table2 b ON b.b_id = a.b_id
    INNER JOIN inserted i ON i.b_id = a.b_id AND i.a_id = a.a_id
    WHERE a.code = i.code
    AND b.b_id <> i.b_id
    AND a.description <> i.description
    AND b.code IN (SELECT code FROM b WHERE b_id = i.b_id)
)
BEGIN
    RAISERROR ('ERROR', 16, 1)
    ROLLBACK TRAN
    RETURN
END

如果仍然没有引发错误,那么应该仔细检查业务逻辑。