Sql server 通过ADO连接在MS Access中执行存储过程-删除应用程序角色
我有一个在MS Access中开发的应用程序,它使用ADO连接到SQL server(Microsoft SQL server 2017)来执行许多存储过程。ADO连接都是通过应用程序角色完成的,以限制权限 在最新的更新中,我创建了几个新的存储过程,这些存储过程返回几个记录集,这些记录集粘贴在Excel中。我的问题是,当我执行这些存储过程时,应用程序角色将被删除。。。查询运行时没有任何问题,但当它完成运行时,应用程序角色未设置 以下是在VBA 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
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查看会话id是否不同。谢谢,Erik。不幸的是,这并没有使错误消失…嗨,尼克。我正在尝试使用ADO和应用程序角色连接到SQL Server。我能够使用一个简单的用户连接到服务器。我创建了一个应用程序角色,但在“用户'testApp'登录失败”时该角色不起作用。您能告诉我如何配置您使用的应用程序角色和连接字符串吗?