如何使用VBA使用Recordset填充ComboBox

Phi*_*ier 8 ms-access vba combobox adodb recordset

在专家交流和teck共和国有一些文献可以 使用combobox.recordset属性来填充Access表单中的组合框.

这些控件通常在控件的"rowsource"属性中填充"SELECT*"字符串,引用应用程序客户端上可用的表或查询.当我需要在组合框中显示服务器端数据时,我创建一个临时本地表并导入请求的记录.这非常耗时,特别适用于大型桌子.

能够使用记录集来填充组合框控件将允许用户直接显示来自服务器端的数据.

受前面两个例子的启发,我写了一些代码如下:

Dim rsPersonne as ADODB.recordset
Set rsPersonne = New ADODB.Recordset

Set rsPersonne.ActiveConnection = connexionActive
rsPersonne.CursorType = adOpenDynamic
rsPersonne.LockType = adLockPessimistic
rsPersonne.CursorLocation = adUseClient

rsPersonne.Open "SELECT id_Personne, nomPersonne FROM Tbl_Personne"

fc().Controls("id_Personne").Recordset = rsPersonne
Run Code Online (Sandbox Code Playgroud)

哪里:

  • connexionActive:是我与数据库服务器的永久ADO连接
  • fc():是我当前/活跃的表格
  • controls("id_Personne"):是用于填充公司员工列表的组合框控件
  • 2003年访问版本

不幸的是,它不起作用!

在调试模式下,我能够检查记录集是否已正确创建,具有请求的列和数据,并且与组合框控件正确关联.不幸的是,当我显示表单时,我不断得到一个空的组合框,没有记录!任何帮助都非常感谢.

编辑:

这个记录集属性确实可用于特定的组合框对象,而不是标准控制对象,几天前我发现它非常惊讶.我已经尝试使用combobox的回调函数,或者使用组合框的"addItem"方法填充列表.所有这些都很耗时.

小智 5

如前所述,您必须将RowSourceType设置为"Table/List"(或"Table /Requête",如果是法语),以便在组合框中显示查询结果.

打开记录集(rsPersonne)而不关闭它会导致内存问题.关闭/卸载表单时应该关闭它们(但是由于记录集在函数中而不是在表单中声明,因此会有范围问题).

您还可以尝试使用Access的内置查询创建器创建并保存查询,并在组合框的RowSource中插入相同的查询.这样,在Access中验证和编译查询.


小智 5

要设置一个接受行源到记录集的控件,请执行以下操作:

Set recordset = currentDb.OpenRecordset("SELECT * FROM TABLE", dbOpenSnapshot)
Set control.recordset = recordset
Run Code Online (Sandbox Code Playgroud)

当然,可以使用DAO记录集,但我没有尝试过ADO记录集,因为我没有任何真正的理由使用它们。

用这种方法完成后,简单的重新查询将无法刷新数据,您必须重复执行set语句。


Phi*_*ier 3

我发现了窍门...组合框控件的“rowSourceType”属性必须设置为“表/查询”。显示现在可以了,但我现在有另一个内存问题。由于我在表单上使用这些 ADO 记录集,因此每次浏览表单时 Access 的内存使用量都会增加。停止浏览或关闭表单都不会释放内存,从而导致 MS Access 不稳定并经常冻结。如果我无法解决这个问题,我会提出一个问题