2017-04-22 106 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,直到消耗完所有結果。