Выполнение хранимой процедуры в MS Access через ADO соединение - удаление роли приложения - PullRequest
0 голосов
/ 21 октября 2019

У меня есть приложение, разработанное в MS Access, которое использует ADO-соединения с SQL-сервером (Microsoft SQL Server 2017) для выполнения многочисленных хранимых процедур. Все соединения ADO выполняются через роль приложения, чтобы ограничить разрешения.

В последнем обновлении я создал несколько новых хранимых процедур, которые возвращают несколько наборов записей, которые вставляются в Excel. Моя проблема в том, что когда я выполняю эти хранимые процедуры, роль приложения удаляется ... Запрос выполняется без каких-либо проблем, но когда он завершается, роль приложения не устанавливается.

Ниже приведен пример вызова одного из сохраненных процедур в VBA Access:


Public Function CDTExceptionsReport() As ADODB.Recordset

    On Error GoTo ErrorHandler

    Set objConn = DB.MaintainConnection

    On Error GoTo 0

    If objCmd_ER Is Nothing Then
        Set objCmd_ER = New ADODB.Command
        With objCmd_ER
            .CommandType = adCmdText
            .CommandTimeout = 60 ' increase command 
            .CommandText = "EXEC tool.ExceptionsReport;"
            .Prepared = True
            ' set connection object
            .ActiveConnection = objConn

        End With
    End If

    Set CDTExceptionsReport = objCmd_ER.Execute

    On Error GoTo 0
     Exit Function
ErrorHandler:
    MsgBox "Error: " & Err.DESCRIPTION & vbNewLine & "Number: " & Err.Number
    On Error GoTo 0 ' reset error handling
End Function

Обратите внимание, что objConn - это мой объект подключения, а objCmd_ER - моя глобальная команда. объект.

Через непосредственный терминал в VBA я могу проверить, какая роль активируется, используя в режиме отладки следующее:

Set RS = objConn.Execute("SELECT CURRENT_USER")
?RS.Fields(0)

Если я запускаю это до строки objCmd_ER.Execute, яможно увидеть, что роль приложения все еще используется. Однако, когда я запускаю это сразу после этого оператора, роль приложения удаляется, и возвращается мое имя пользователя Windows. Кто-нибудь испытывал это раньше?

Я выполнил эту хранимую процедуру непосредственно в SQL Server, и она отлично работает и не выводит роль приложения из системы. Поэтому я думаю, что это как-то связано с соединением ADO.

Пожалуйста, дайте мне знать, какую дополнительную информацию было бы полезно предоставить. Хранимая процедура не содержит языка DDL или DML - всего 4 запроса на выборку.

Спасибо

1 Ответ

1 голос
/ 21 октября 2019

Никогда не делайте этого!

.ActiveConnection = objConn

. При этом объект подключения objConn преобразуется в строку подключения, затем создается новое подключение с использованием этой строки подключения и используется в качествеактивное соединение.

Вместо этого всегда делайте это:

Set .ActiveConnection = objConn

Это фактически устанавливает активное соединение для вашего объекта соединения.

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