Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 通过ADO连接在MS Access中执行存储过程-删除应用程序角色_Sql Server_Vba_Ms Access_Ado - Fatal编程技术网

Sql server 通过ADO连接在MS Access中执行存储过程-删除应用程序角色

Sql server 通过ADO连接在MS Access中执行存储过程-删除应用程序角色,sql-server,vba,ms-access,ado,Sql Server,Vba,Ms Access,Ado,我有一个在MS Access中开发的应用程序,它使用ADO连接到SQL server(Microsoft SQL server 2017)来执行许多存储过程。ADO连接都是通过应用程序角色完成的,以限制权限 在最新的更新中,我创建了几个新的存储过程,这些存储过程返回几个记录集,这些记录集粘贴在Excel中。我的问题是,当我执行这些存储过程时,应用程序角色将被删除。。。查询运行时没有任何问题,但当它完成运行时,应用程序角色未设置 以下是在VBA Access中调用的一个存储过程的示例: Publ

我有一个在MS Access中开发的应用程序,它使用ADO连接到SQL server(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个select查询

谢谢

千万不要这样做

.ActiveConnection=objConn

将连接对象
objConn
强制转换为连接字符串,然后使用该连接字符串创建新连接,并将其用作活动连接

相反,请始终这样做:

Set.ActiveConnection=objConn


这实际上设置了与连接对象的活动连接。

请注意,应用程序角色在连接池中的作用不好。在按说明关闭连接之前,请使用
sp_unsetapprole
。谢谢,@DanGuzman-有很多存储过程会重复执行。您是否建议我必须在每次调用存储过程之前和之后(分别)设置和取消设置该过程?由于我在这里提到的原因,我倾向于不关闭连接,因为下一个存储过程永远不会超过30秒。在ach调用之前不设置/取消设置,而是在每个连接打开之后设置,并在连接关闭/关闭之前取消设置。否则,您将需要禁用连接池。我会在连接打开后设置应用程序角色。我从不密切联系;我想他们最终会超时的。这可能与此有关吗?如果您从未通过连接字符串关闭连接或关闭池,则与应用程序角色的连接池将不会成为问题。我怀疑您遇到的问题是因为ADO正在背后打开连接,因为指定的连接已经在使用中。运行
SELECT@@SPID