### Access 2000开发使用手册030:使用ADO记录集、窗体和控件 #### 30.1 利用VBA操纵记录集 **记录集(Recordset)**是Access数据关联操作的基础。无论是数据页的VCR(View Control Recordset)操纵按钮还是绑定窗体,它们都是通过记录集的记录指针来进行工作的。本章节将重点介绍如何利用VBA(Visual Basic for Applications)代码来模拟Access中的操纵按钮功能,以及如何使用循环结构来自动化处理整个记录集。 ##### 30.1.1 生成临时记录集 在某些特定情况下,比如填充列表框或组合框时,开发者可能需要创建临时记录集。这些记录集在完成任务后会被关闭并释放与后台数据库的链接,以便为后续的操作留出空间。可以通过将记录集设置为Nothing来释放其内存资源,但是这样做之后就不能再重新打开这个对象了。通常,当打开一个含有非绑定控件的窗体,且这些控件需要依赖记录集获取数据时,会创建临时记录集。 下面是创建一个新的数据库,并使用VBA打开临时记录集的具体步骤: 1. **备份原始数据库**:首先将Northwind.mdb数据库压缩到另一个文件,如Nwind.mdb,以创建一个工作副本。这样做的目的是避免对原始的Northwind.mdb进行永久性的修改。 2. **创建新数据库**:在存放Nwind.mdb的文件夹中,新建一个名为ADO_VBA.mdb的数据库。 3. **设计非绑定窗体**:在“设计”视图中创建一个新的非绑定窗体,注意不要为这个窗体指定记录源。 4. **编写VBA代码**:点击“代码”按钮,在VBA编辑器中显示窗体的类模块。然后在声明部分的`Option Explicit`之下添加以下三个窗体级变量: ```vb Private cnnNwind As New ADODB.Connection Private rstTemp As New ADODB.Recordset Private strSQL As String ``` 5. **编写Form_Load事件处理器**:在“对象”列表中选择“窗体”,生成`Form_Load`事件处理占位程序。接下来,在`Form_Load`事件处理器中添加以下代码,用于创建一个基于记录源属性值的可更新(可编辑)记录集,该属性值已预先加载到`cboProducts`组合框中。 ```vb With cnnNwind .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = CurrentProject.Path & "\Nwind.mdb" .Open End With strSQL = "SELECT ProductID, ProductName FROM Products ORDER BY ProductName" With rstTemp .ActiveConnection = cnnNwind .CursorType = adOpenKeyset .LockType = adLockOptimistic .Open strSQL End With ``` 6. **连接控件**:在完成了以上步骤后,可以将记录集与窗体上的控件进行连接,例如将`cboProducts`组合框绑定到记录集,使其能够显示产品名称。 通过这种方式,我们可以利用VBA创建并管理临时记录集,这对于在Access应用程序中实现更复杂的逻辑非常有用。 #### 30.2 由记录集对象填充列表框 利用记录集对象填充列表框是一个常见的需求,特别是当需要从数据库中获取数据并展示给用户时。这可以通过简单的VBA代码来实现。例如,假设我们已经有了一个名为`rstProducts`的记录集对象,它包含了产品列表,那么可以使用以下代码片段来填充一个名为`lstProducts`的列表框: ```vb With rstProducts If Not .EOF Then Do Until .EOF lstProducts.AddItem .Fields("ProductName").Value .MoveNext Loop Else MsgBox "没有找到任何产品记录。" End If End With ``` #### 30.3 使用“Find”方法和书签 除了常规的记录集操作外,有时还需要使用“Find”方法来查找特定的记录,或者使用书签来标记记录。这在需要快速定位特定记录的情况下非常有用。例如,以下代码展示了如何使用“Find”方法来查找具有特定条件的记录,并如何使用书签来标记当前记录位置: ```vb ' 假设有一个名为rsCustomers的记录集对象 With rsCustomers ' 查找第一个名为"John Doe"的客户 .Find "FirstName='John' AND LastName='Doe'" If Not .NoMatch Then ' 如果找到了匹配项,则标记当前位置 .Bookmark = "JohnDoeBookmark" Else MsgBox "未找到匹配的记录。" End If End With ``` #### 30.4 格式化值列表组合框的列 对于包含多个字段的组合框,可能需要对其进行格式化以增强用户体验。例如,可以在组合框中同时显示产品名称和产品价格,但只允许用户根据产品名称进行选择。这可以通过设置组合框的RowSource和RowSourceType属性来实现,并使用VBA代码来格式化显示的数据: ```vb With cboProducts .RowSource = "Products" .RowSourceType = "Table/Query" .List = Array("ProductName", "Price") .BoundColumn = 1 End With ``` #### 30.5 修改记录集的记录 修改记录集中的记录通常是通过直接更改记录集中的字段值来完成的。例如,要更改产品的价格,可以使用以下代码: ```vb With rsProducts .Edit .Fields("Price").Value = 99.99 .Update End With ``` #### 30.6 将frmComboVBA导出到一个Access数据工程 如果希望将窗体和相关的VBA代码作为一个整体导出到Access数据工程(ADP),可以按照以下步骤操作: 1. 打开包含窗体的数据库。 2. 在数据库窗口中,选择窗体并右键点击,选择“导出”选项。 3. 选择导出的目标数据库文件,并确保目标数据库支持ADP格式。 4. 按照向导的提示完成导出过程。 #### 30.7 由记录集填充组合集 与填充列表框类似,也可以使用记录集来填充组合框。具体的方法是在组合框的`AfterUpdate`事件中执行查询,然后使用查询结果填充组合框: ```vb Private Sub cboProducts_AfterUpdate() Dim rsRelatedProducts As New ADODB.Recordset With rsRelatedProducts .Open "SELECT ProductName FROM Products WHERE SupplierID=" & Me.cboProducts.Value, cnnNwind Me.cboRelatedProducts.RowSource = "ProductName" Me.cboRelatedProducts.Requery End With End Sub ``` #### 30.8 疑难解答 在处理记录集时可能会遇到各种问题,以下是一些常见问题及其解决方法: - **记录集为空**:确保查询语句正确无误,并且数据库中存在相应的数据。 - **记录集打开失败**:检查连接字符串是否正确,包括提供者和连接字符串参数。 - **记录集更新失败**:确认是否有足够的权限进行数据更改,并确保没有其他用户正在使用这些记录。 #### 30.9 改变组合框列表的排序 改变组合框列表的排序可以通过在查询中加入`ORDER BY`子句来实现。例如,如果想要按产品名称升序排列,可以在查询语句中添加如下内容: ```vb strSQL = "SELECT ProductID, ProductName FROM Products ORDER BY ProductName ASC" ``` #### 30.10 现实世界—适应ADO 随着技术的发展,ADO已成为Access和其他数据库应用程序的标准数据访问接口。了解如何使用ADO不仅可以提高Access应用程序的性能和可靠性,还可以更好地与其他基于OLE DB的系统集成。因此,熟悉ADO的基本概念和技术是非常重要的。 通过上述章节的学习,读者应该能够掌握如何使用VBA来控制记录集,以及如何使用记录集来填充窗体控件,从而提高Access应用程序的功能性和灵活性。
- 粉丝: 377
- 资源: 78
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助