2017-04-22 101 views
0

下面的示例代码意外失败时返回错误不工作,通过VBA一个ADODB连接运行两个SQL语句时多个SQL语句预期

Dim conn As ADODB.Connection 
Set conn = return_connection(server:="Database")  
test_statement = "Select (1) if 1=1 THROW 50001, 'Error description', 1;"  
conn.Execute (test_statement) 

但是运行下面的语句来代替

Dim conn As ADODB.Connection 
Set conn = return_connection(server:="Database") 
test_statement1 = "Select (1)" 
test_statement2 = "if 1=1 THROW 50001, 'Error description', 1" 
conn.Execute (test_statement1) 
conn.Execute (test_statement2) 

完美地工作。

此外,如果我复制和粘贴

Select (1) if 1=1 THROW 50001, 'Error description', 1; 

到SQL管理员它的工作原理完全如我所料有问题的代码做的事:做一个选择,然后抛出一个错误。

任何人都可以解释这一点吗?

显而易见的'解决方案'是分离出不同的语句,在VBA中分开运行,我将从现在开始。

但是,我显然不明白Adodb如何与SQL协同工作,因此我想知道是什么导致了这种行为。此外,我还有一些不重要的多重SQL语句,这些语句被连接在一起,然后通过Adodb连接传递给SQL,所以我想知道何时可以安全地执行以及何时需要重新构建代码。

回答

1

仔细看看你的SQL语句,它是一个语句而不是多个语句,因为没有行分隔符;。改变你的语句从

test_statement = "Select (1) if 1=1 THROW 50001, 'Error description', 1;" 

test_statement = "Select (1); if 1=1 THROW 50001, 'Error description', 1;" 

此外,如果要执行多个语句然后再考虑包装的所有SQL语句在Stored Procedure代替

+0

不幸的是,ADODB sql代码仍然不能像预期的那样使用分号,至少在我的结尾。 我正在研究存储过程,并且通常不再使用VBA来存储和触发复杂的SQL-但不幸的是,我受到其他因素的限制,无法使用此存储过程 – Eladriol

0

尝试增加SET NOCOUNT ON;作为第一个发言在批次中。这会抑制DONE_IN_PROC TDS消息(行计数)混淆了不期望它们的客户端代码。 ADO classic对于这一点声名狼借(而不是ADO.NET的问题)。

或者,您可以使用RecordSet对象并调用NextResult,直到消耗完所有结果。