C# 在.NET应用程序中忽略T-SQL触发器时出错

C# 在.NET应用程序中忽略T-SQL触发器时出错,c#,sql,.net,sql-server,C#,Sql,.net,Sql Server,我有一个TableAdapter,我正在调用适配器的UpdateDataSet数据集函数。基础表上有一个触发器正在抛出错误,但此错误不会在select语句之后的应用程序中导致异常,但如果我只是在触发器的开头引发它,则会导致异常。有什么想法吗 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER [dbo].[trigger1] ON [dbo].[table1] AFTER INSERT, UPDATE

我有一个TableAdapter,我正在调用适配器的UpdateDataSet数据集函数。基础表上有一个触发器正在抛出错误,但此错误不会在select语句之后的应用程序中导致异常,但如果我只是在触发器的开头引发它,则会导致异常。有什么想法吗

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 

您似乎正在检查@@ROW\u 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

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

为什么在am UPDATE触发器中有SELECT语句?还有,抛出了什么类型的错误?我认为查看select语句会很有帮助。添加select语句后,我需要它来强制执行业务规则。我只是不明白为什么RAISERROR的位置很重要,SELECT语句如何停止触发器的执行,从而不会引发错误?您还可以使用If ExistsSelect。。。随着表的增长,这将大大减少开销。即使我完全删除了if,也不会引发错误,除非我也删除了SELECT语句,使错误成为触发器中唯一的内容。这就像执行没有通过SELECT语句一样,问题在于SELECT语句的逻辑,我觉得它很复杂。确保您的选择在违反业务规则时生成一行,而在满足业务规则时不生成一行。如果需要反转逻辑,可以使用NOT EXISTS。