【问题标题】:VBA in Access 2010 - Run-time Error 430Access 2010 中的 VBA - 运行时错误 430
【发布时间】:2013-12-06 17:23:52
【问题描述】:

我在这行代码Set Me.lstResults.Recordset = rsSet Me![frmM_SearchForDocumentsSubForm].Form.Recordset = rs 上收到运行时错误“430”:类不支持自动化或不支持预期的接口。我正在尝试获取 ADO 记录集基于 SQL 存储过程出现在未绑定的列表框或 Access 表单的子表单中。我在 Win 7 机器上使用 Access 2010 连接到 SQL Server 2008:

On_Click 事件:

Private Sub cmdRun_Click()
'On Error Resume Next

    Dim strSQL As String

    'Stored procedure + parameters called from form
    strSQL = "Exec sqlsp_searchalltables " & Me.txtTables & _
       ", " & "'%" & Me.txtSearchTerm & "%'"

    OpenMyRecordset rs, strSQL

    'debug - view procedure
    Me.lblQuery.Caption = strSQL
    Me.Repaint

    Set Me.lstResults.Recordset = rs
    'or this
    'Set Me![frmM_SearchForDocumentsSubForm].Form.Recordset = rs
End Sub

我在网上找到了一些解决此错误的方法,并尝试了所有方法均无济于事。大多数人建议检查我所做并验证的参考资料。

当我使用 DAO Querydef 和直通查询或使用此 .listbox 方法时,我能够成功连接到 SQL 服务器并在列表框和子窗体中显示结果:

With Me.lstResults
    Do
       strItem = rs.Fields("CLIENT_ID").Value
       .AddItem strItem
       rs.MoveNext
    Loop Until rs.EOF
End With

我不想使用 DAO 方法,因为我发现我需要 ADO 的编码灵活性,尤其是在连接到 SQL 中的多个记录集时。想法?

仅供参考:我的 OpenMyRecordset 模块中的公共函数:

Option Compare Database
Option Explicit

Global con As New ADODB.Connection
Global rs As ADODB.Recordset
Global NoRecords As Boolean

Public Enum rrCursorType
    rrOpenDynamic = adOpenDynamic
    rrOpenForwardOnly = adOpenForwardOnly
    rrOpenKeyset = adOpenKeyset
    rrOpenStatic = adOpenStatic
End Enum

Public Enum rrLockType
    rrLockOptimistic = adLockOptimistic
    rrLockReadOnly = adLockReadOnly
End Enum

Public Function OpenMyRecordset(rs As ADODB.Recordset, strSQL As String, Optional rrCursor As rrCursorType, _
    Optional rrLock As rrLockType, Optional bolClientSide As Boolean) As ADODB.Recordset

    If con.STATE = adStateClosed Then
        con.ConnectionString = "ODBC;Driver={SQL Server};Server=mysqlsvr;DSN=RecordsMgmt_SQLDB;UID=XXX;Trusted_Connection=Yes;DATABASE=RecordsManagementDB;"
        con.Open
    End If

    Set rs = New ADODB.Recordset
    With rs
        .ActiveConnection = con
            .CursorLocation = adUseClient
        .CursorType = IIf((rrCursor = 0), adOpenDynamic, rrCursor)
        .LockType = IIf((rrLock = 0), adLockOptimistic, rrLock)
        .Open strSQL
        If .EOF And .BOF Then
            NoRecords = True
            Exit Function
        End If
    End With

End Function

【问题讨论】:

    标签: sql sql-server vba ms-access listbox


    【解决方案1】:

    您绝对不必为了填充列表框而使用循环方法。我不熟悉您使用的 OpenMyRecordset 命令,但我怀疑它的功能中的某些东西是导致此错误的原因(即,它没有以与列表框兼容的方式打开记录集)。这就是我连接到本地 SQL Server Express 实例并能够填充列表框的方式。

    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    
    Set cn = New ADODB.Connection
    
    With cn
        .ConnectionString = _
            "Provider=SQLOLEDB;Data Source=localhost\SQLEXPRESS;" & _
            "Initial Catalog=Northwind;Trusted_Connection=yes"
        .Open
    End With
    
    Set rs = New ADODB.Recordset
    
    With rs
        Set .ActiveConnection = cn
        .Source = "SELECT FirstName, LastName FROM Employees"
        .LockType = adLockOptimistic
        .CursorType = adOpenKeyset
        .Open
    End With
    
    Set Me.lstTest.Recordset = rs
    
    Set rs = Nothing
    Set cn = Nothing
    

    您必须确保在您的项目中启用了 Microsoft ActiveX 数据对象库引用。

    【讨论】:

    • OpenMyRecordSet 调用模块中的公共函数,该函数对 rs 对象进行 delares。查看您的代码,我想我需要更改.LockType.CursorType。我会回复你,让你知道是否这样做。
    • 好的,将 LockTypeCursorType 分别更改为 adLockOptimistic (prev. adLockReadOnly) 和 adOpenDyamic (prev. adOpenStatic),分别有效。我不再得到运行时 430,但现在我得到“运行时错误 7965:您输入的对象不是有效的记录集属性”,它引用了同一行代码:Set Me.lstResults.Recordset = rs
    • 您是否能够在不进行任何其他操作的情况下对rs 执行其他记录集功能? (因为您提到更改查询的 DAO 示例)。如果它是一个记录集,它可能与列表框不兼容。很难说,因为你有一个带有 OpenMyRecordset 功能的“黑匣子”......
    • 是的,我可以成功地执行循环方法来填充列表框。我已经编辑了我的问题以包含 OpenMyRecordset 函数。希望这会有所帮助。
    • 我可以通过删除在我的公共函数中引用.CursorLocationIF..THEN..ELSE 语句来消除错误。现在它只读取.CursorLocation = adUseClient。 Viola,它现在可以完美运行了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多