我在各种表上有一些触发器,它们使用 raiserror 来告诉用户他试图做一些坏事。我想以原子方式运行多次插入和更新,如果触发器之一如此,则回滚。我前世是邪恶的,所以我使用 Access VBA。
如果第一个语句有错误,我的 VBA 中就会出现运行时错误。但是,如果第二个或后续语句调用 raiserror 那么我看不到任何错误消息。
解决方案:检查connection.Errors 集合。
这是一个 Access 2007 ADP 前端和一个 SQL 2005 数据库。
下面的 VBA 是显示效果的最低限度。如果我将所有原子语句包装在存储过程中,我会得到相同的效果。
我认为我很聪明,让我的验证尽可能接近数据库。很明显不是!
如果您想尝试下面的代码,请交换 CommandText 中 s1 和 s2 的顺序并欣赏不同的结果。
Public Sub TestSqlErrors2()
'CREATE TABLE [dbo].[tblStuff]([id] [int] IDENTITY primary key NOT NULL,[stuff] [varchar](255) NULL)
Dim cmd As ADODB.Command
Dim cnn As ADODB.Connection
Dim r As Long
Dim s1 As String
Dim s2 As String
s1 = " insert into tblStuff(stuff) values ('aaa') "
s2 = " if 1=1 begin …Run Code Online (Sandbox Code Playgroud)