Чтобы бесстыдно спрятать @Erik, вы хотите создать новый класс, который будет обрабатывать вашу обработку. Что-то вроде cProcedureHandler
. В этом классе вам нужно объявить объект ADODB.Connection
с помощью ключевого слова WithEvents
:
Dim WithEvents cn As ADODB.Connection
. Затем вам нужно написать обработчик событий InfoMessage
, который позаботится о многократной печати заявления. Информацию о событии InfoMessage
можно найти здесь здесь , а с помощью коллекции Errors
соединения можно найти здесь здесь . Итак, вы получите что-то вроде этого:
Private Sub cn_InfoMessage(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)
Dim err As ADODB.Error
Debug.Print cn.Errors.Count & " errors"
For Each err In cn.Errors
' handle each error/message the way you need to.
Debug.Print err.Description
Next err
End Sub
Поскольку вы позаботились о том, чтобы код обрабатывал несколько сообщений, теперь вам просто нужно обрабатывать несколько наборов записей, что объясняется довольно хорошо в указанной вами ссылке. Одна вещь, которую я заметил, это то, что ссылка на пример использовалась rs is nothing
как проверка, когда не было больше наборов записей, что не сработало для меня. Мне пришлось использовать свойство rs State
. Итак, я закончил с этим:
Public Sub testProcedure()
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim recordSetIndex As Integer
Set cn = modData.getConnection
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "dbo.sp_foo"
Set rs = cmd.Execute
recordSetIndex = 1
Do Until rs.State = ObjectStateEnum.adStateClosed
Debug.Print "contents of rs #" & recordIndex
Do Until rs.EOF
Debug.Print rs.Fields(0) & rs.Fields(1)
rs.MoveNext
Loop
Set rs = rs.NextRecordset
recordSetIndex = recordIndex + 1
Loop
cn.Close
Set rs = Nothing
Set cn = Nothing
Set cmd = Nothing
End Sub
Затем, когда вы готовы запустить свой SP из VBA, просто сделайте что-то вроде этого:
set obj = new cProcedureHandler
obj.testFooProcedure
Другое дело ( вы, наверное, уже это сделали): Убедитесь, что ваша фактическая хранимая процедура в SQL Server устанавливает nocount.