Принудительное игнорирование ошибок из ADODB в Excel VBA - PullRequest
1 голос
/ 24 февраля 2011

Не знаю, возможно ли это, но я решил спросить.

Существует ли эквивалент On Error GoTo Next для соединений ADODB в Excel VBA?

У меня есть хранимая процедура, которую я вызываю с использованием объекта ADODB.Command. Проблема в том, что если какой-либо один оператор в этой хранимой процедуре выдает ошибку, весь процесс завершается. Да, это уместно в некоторых случаях, но в моем случае это не имеет большого значения, я просто хотел бы продолжить выполнение остальной части хранимой процедуры в любом случае.

On Error GoTo 0 показывает сообщение об ошибке SQL и предоставляет опции «Конец» или «Отладка».

On Error Resume Next пропускает сообщение об ошибке SQL, но молча отменяет команду SQL и перемещает следующий оператор VBA.

Есть идеи?

РЕДАКТИРОВАТЬ: У меня был запрос на мой код. Я не уверен, что это вам сильно поможет, но здесь:

On Error GoTo 0

ServerConnection.Open "Provider=MSDASQL.1;Persist Security Info=True;Extended Properties="DRIVER=SQL Native Client;Trusted_Connection=Yes;SERVER=DBServer;DATABASE=Database";"

Dim SqlCommand As ADODB.Command
Set SqlCommand = New ADODB.Command

With SqlCommand
    .ActiveConnection = ServerConnection
    .CommandText = "EXEC CacheTables @CacheTableType1=True"
    .CommandType = adCmdText
    .Execute
End With

ServerConnection.Close

Set SqlCommand = Nothing
Set ServerConnection = Nothing

К сожалению, я на самом деле не контролирую хранимую процедуру, но причина, по которой она выдает ошибки, заключается в том, что человек, который ее написал, использовал операторы RAISERROR, чтобы сообщить пользователю, где находится выполнение. Это нормально в SQL Server, который понимает флаг «Приоритет» и, следовательно, продолжает выполняться, но VBA, похоже, считает, что все ошибки имеют одинаковую важность.

1 Ответ

1 голос
/ 24 февраля 2011

Поскольку обработка вашей хранимой процедуры все происходит на вашем сервере БД, вы должны иметь какую-то обработку ошибок внутри хранимой процедуры.Например, блок Try / Catch в вашем TSQL, если вы используете Sql Server:

BEGIN TRY
     { sql_statement | statement_block }
END TRY
BEGIN CATCH
     [ { sql_statement | statement_block } ]
END CATCH
[ ; ]

http://msdn.microsoft.com/en-us/library/ms175976.aspx

В качестве альтернативы вы можете разбить свои спроки на логические деления и окружить каждый вызовOn Error GoTo Next блоков в VBA.Хотя последний вариант довольно грязный, я верю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...