2017-04-22 5 views
0

Der folgende Beispielcode unerwartet erwartet ausfällt einen Fehler zurückgibt, bei der Ausführung von zwei SQL-Anweisungen durch eine adodb Verbindung in VBAMehrere SQL-Anweisungen zusammen geführt funktionieren nicht wie

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) 

jedoch die unten Anweisung ausgeführt wird, statt

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) 

Funktioniert einwandfrei.

Zusätzlich wenn ich kopieren und

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

in SQL Manager einfügen es funktioniert genau so, wie ich den problematischen Code erwartet zu tun: tut eine Auswahl und dann wirft einen Fehler.

Kann mir das jemand erklären?

Offensichtlich ist die offensichtliche "Lösung", verschiedene Anweisungen zu trennen, die getrennt in VBA ausgeführt werden, was ich von nun an tun werde.

Allerdings verstehe ich anscheinend nicht etwas Grundlegendes darüber, wie Adodb mit SQL funktioniert, also würde ich gerne wissen, was dieses Verhalten verursacht. Zusätzlich habe ich nicht triviale multiple SQL-Anweisungen, die verkettet und dann über Adodb-Verbindungen in SQL übergeben werden, also würde ich gerne wissen, wann das so ist und wann ich Code neu aufbauen muss.

Antwort

1

Betrachten Sie Ihre SQL-Anweisung sorgfältig und es handelt sich um eine einzelne Anweisung und nicht mehrere Anweisung, da kein Zeilentrennzeichen ; vorhanden ist. Ändern Sie Ihre Aussage von

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

Um

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

Außerdem, wenn Sie mehrere Anweisung ausführen wollen, dann betrachten Sie alle Einwickeln Ihre SQL-Anweisung in einer Stored Procedure statt

+0

Leider funktioniert die ADODB SQL-Code-Schwelle nicht wie erwartet mit dem Semikolon, zumindest an meinem Ende. Ich untersuche Stored Procedures und entferne mich generell von der Verwendung von VBA zum Speichern und Triggern von komplexem SQL - aber leider bin ich durch andere Faktoren daran gehindert, dies für den Moment zu verwenden – Eladriol

0

Versuchen Hinzufügen SET NOCOUNT ON; als erste Anweisung im Stapel. Dies unterdrückt DONE_IN_PROC TDS-Nachrichten (Zeilenanzahl), die den Client-Code verwirren, der sie nicht erwartet. ADO classic ist dafür berüchtigt (kein Problem mit ADO.NET).

Alternativ können Sie ein RecordSet-Objekt verwenden und die NextResult aufrufen, bis alle Ergebnisse verbraucht sind.

Verwandte Themen