【发布时间】:2013-12-06 17:23:52
【问题描述】:
我在这行代码Set Me.lstResults.Recordset = rs 或Set 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