从.Net应用程序调用存储过程后如何检测该触发器失败?

Man*_*ion 5 sql sql-server triggers stored-procedures sql-server-2008

我们有一个.NET应用程序(VB/VS2010),并在SQL Server 2008上调用许多存储过程以进行数据库查询.我们还有一些更新/插入/删除触发器,一旦这些存储过程修改数据库表就会自动执行.

通常情况下,调用存储过程并且它似乎执行正常,因为没有引发错误并且.NET应用程序像往常一样继续.但是,如果我查看封面并通过SQL Server客户端手动执行存储过程调用,我会看到在存储过程失败后立即执行的触发器,从而回滚所有更改.

所以我的问题是:在.NET应用程序中检测并传递错误的最佳方法是什么 - >存储过程 - >触发器方案,以确保在.NET应用程序中确保一切都成功或不出错?

非常感谢,史蒂夫


更新:我现在在家,离开我的办公桌(和代码库)周末,所以没有机会检查存储过程的细节.非常感谢到目前为止给出的答案.我可以在下周再看一下代码.

但在此期间......

一个问题是关于MS SQL Server的版本:它是2008年.

据我所知,我们以这种方式调用存储过程(至少那些不读取数据并"只是"更新,删除或插入数据的存储过程):

Using connection As New SqlConnection("connectionString")
    Dim command As New SqlCommand("EXEC STORED_PROCEDUR_ENAME), connection)
    command.Connection.Open()
    command.ExecuteNonQuery()
End Using
Run Code Online (Sandbox Code Playgroud)

我认为上面代码背后的假设是期望如果某些内容在存储过程或相关触发器中失败,那么

command.ExecuteNonQuery()
Run Code Online (Sandbox Code Playgroud)

然后会失败.这可能是我的第一个问题,即我必须改变这段代码吗?下面的一个问题是如果我使用ExecuteDataReader,那么答案是否定的,至少目前为止......

我将在下面评论SQL特定的问题和建议.

Jim*_*Jim 0

您应该在每条语句后检查@@error,如果存在则返回错误。

这是一篇适合您的好文章。查看“为什么没有引发我的错误”部分。它描述了可能是您的问题的场景。

http://www.sommarskog.se/error-handling-II.html

您可能还想尝试打开 XACT_ABORT,这样存储过程对于大多数错误都会失败。

编辑:这是另一个链接可能有助于解释这一点。

http://www.novicksoftware.com/tipsandtricks/tips-erorr-handling-in-a-stored-procedure.htm

如果检查 @@error 并发现它!= 0,则可以从过程中返回错误,或者可以使用 RAISERROR,这肯定会导致调用代码中出现异常。

http://msdn.microsoft.com/en-us/library/ms178592.aspx