首页 > 解决方案 > 在 VBA 中使用记录集时如何修复错误 7965?

问题描述

我正在使用 VBA 中的子表单(ms access 2013)。我正在尝试使用从存储过程(SQL-Server v17.9.1)返回的数据加载 2 个文本框当我在 Management Studio 中运行 proc 时,我得到 3 行返回,只有 2 列员工的姓名缩写和总数他们的客户。

当我尝试将表单的记录集 (Set Me.Recordset = rst) 设置为查询返回的记录集时,出现以下错误:

“错误 7965:您输入的对象不是有效的 Recordset 属性。”

这是一个现有的访问数据库(2013),我的公司希望将访问表单保留为前端,但将所有数据和操作指向一个 SQL-Server(V17.9.1)数据库。

Private Sub Form_Load()
    Dim strError As String
    Dim cnn As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rs As ADODB.Recordset

    On Error GoTo Err_Handler

    Set cnn = New ADODB.Connection
    cnn.Open gconConnectOLEDB
    Set cmd = New ADODB.Command
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "spGetInitialsAndCounts"
    cmd.ActiveConnection = cnn

    Set rs = New ADODB.Recordset
    Set rs = cmd.Execute

    Set Me.Recordset = rs  '<---- This is where the error is occurring
    Me.Rep.ControlSource = "Rep"
    Me.CountOfRep.ControlSource = "CountOfActiveClients"

Exit_Handler:
    On Error Resume Next

    If LenB(strError) Then
        MsgBox strError, vbCritical, Me.Name & ".Form_Load"
    End If

    If Not(rs Is Nothing) Then
        rs.Close
        Set rs = Nothing
    End If

    If Not(cnn Is Nothing) Then
       If Not(cnn.State = adStateClosed) Then cnn.Close
      Set cnn = Nothing
    End If

    Exit Sub
Err_Handler:
   strError = "Error " & Err.Number & ": " & Err.Description
   Resume Exit_Handler
End Sub

最令人沮丧的是在其他形式中使用了类似的代码,并且文本框填充正确。

感谢您提供的任何帮助和见解。

标签: sql-serverms-access-2013

解决方案


经过大量研究,最终发现需要将 ADODB Recordset 的“CursorLocation”属性设置为 adUseClient。“CursorLocation”属性可以设置为“adUseServer”或“adUseClient”。就我而言,我根本没有为它指定一个值,它默认为 adUseServer。我更正的代码片段如下:

Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset

Set cnn = New ADODB.Connection
cnn.Open gconConnectOLEDB

With rs
  Set .ActiveConnection = cnn
      .Source = "EXEC spSQLServerProc "
      .LockType = adLockOptimistic
      .CursorType = adOpenKeyset
      **.CursorLocation = adUseClient**
      .Open
End With
Set Me.Recordset = rs

推荐阅读