如何在 Ms 访问子窗体中显示记录集数据

Posted

技术标签:

【中文标题】如何在 Ms 访问子窗体中显示记录集数据【英文标题】:How to show recordset data in Ms access subform 【发布时间】:2012-07-30 00:56:36 【问题描述】:

如何在 Access Sub 表单控件中显示一个 SQL 查询的结果?我试过下面的代码

Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Dim qry As String

qry = "SELECT FirstName,Email FROM Customer" '
Set rs = db.OpenRecordset(qry)

Customer_enquiry_subform.Form.Recordset = rs

Customer_enquiry_subform 是我的子表单的名称。我的子表单中只有 2 列要显示,FirstName,Email

它给我一个错误

运行时错误 3251:此类型的操作不支持 对象。

谁能告诉我我做错了什么?

【问题讨论】:

【参考方案1】:

我知道这个问题已经有 2 年历史了,但是对于我们这些偶然发现它并确实想为 Access Subform 控件使用 SQL 查询的人(许多 SQL 查询/存储过程太复杂而无法放入表单中)记录源)...我发现 ADO 效果很好。请参阅http://support.microsoft.com/kb/281998/EN-US/ 以获得很好的解释。为了让它在子表单上工作,我将代码放在子表单的“打开”事件上 - 而不是表单的。

需要注意的是,子表单不会绑定到主表单(父/子丢失),因此我相信您将不得不依赖其他代码来添加新记录。我的特定子表单是只读的,因此它不需要是父/子 - 当我调用存储过程以重新创建父/子效果时,我使用主表单中的记录 ID 作为参数(请参阅下面的代码以获取我的示例)。

此外,如果您不指定 LockType adLockPessimistic 或 adLockOptimisic,此代码将不起作用:adLockReadOnly 不起作用(请参阅In Memory, Stand-Alone, Disconnected ADO Recordset)。您将收到错误“对象不是有效的 Recordset 属性”,这可能会引起一些头痛。 :)

我的示例代码(我使用来自https://accessexperts.com/blog/2011/01/21/easy-adodb-recordsets-and-commands-in-access/ 的 Juan Soto 的通用 ADO 连接示例):

   Private Sub Form_Open(Cancel As Integer)
   On Error GoTo ErrHandler
   Dim rs As ADODB.Recordset
   Dim strSQL As String
   Dim strPoint As String

   'I use my Point_ID from my main form as a parameter to fill the subform to recreate the "parent/child" effect
   strPoint = Forms!FRM_Vegetation_Strata!Point_ID
   strSQL = "sp_Report_VegWorksheet '" & strPoint & "'"

   'this method of calling the sub "OpenMyRecordset" is from Soto's example listed above
   OpenMyRecordset rs, strSQL, rrOpenStatic, rrLockOptimistic, True
   With rs
   If .RecordCount = 0 Then
   MsgBox "No records returned"
   End If
   End With

   Set Me.Recordset = rs


ExitProcedure:
    On Error Resume Next
    Exit Sub

ErrHandler:
    MsgBox Err.Description & " (" & Err.Number & ") encountered", vbOKOnly + vbCritical, "InitConnect"
    Resume ExitProcedure

    Resume
End Sub

当主窗体上的数据发生变化时刷新子窗体:

Private Sub cmdRefresh_Click()
Me.Form.Recordset.Requery
Set Me.Form.Recordset = Me.Form.Recordset
End Sub

当表单关闭时(在子表单“关闭”事件上)

Private Sub Form_Unload(Cancel As Integer)
   'Close the ADO connection we opened
   On Error Resume Next
   Dim cn As ADODB.Connection
   Dim rs As ADODB.Recordset

   Set cn = Me.Recordset.ActiveConnection
   If cn.State = adStateOpen Then
    cn.Close
   End If

   Set cn = Nothing
   Set rs = Nothing
   Set Me.Recordset = Nothing

End Sub

【讨论】:

【参考方案2】:

如果要将表单的记录源设置为记录集,则需要使用 ADO。但是,我怀疑您的意思是:

 qry = "SELECT FirstName,Email FROM Customer"
 Me.Customer_enquiry_subform.Form.Recordsource = qry

也就是说,您不需要记录集,只需将记录源设置为字符串即可。

【讨论】:

以上是关于如何在 Ms 访问子窗体中显示记录集数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Access 的子窗体上不显示选定的记录?

MS Access 子窗体不显示记录且不导航

循环访问 MS Access 子窗体并获取列可见性

如何在 VBA 访问的子窗体中显示 Select SQL 语句的结果?

单击父窗体时不会触发访问 VBA 子窗体事件

MS Access VBA - 在数据表子窗体中显示动态构建的 SQL 结果