Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-模块/函数/VBA

从 DAO Recordset 的记录中提取数据

时 间:2022-12-31 08:07:47
作 者:杨雪   ID:42182  城市:南京
摘 要:从 DAO Recordset 的记录中提取数据
正 文:

本文内容
复制单个字段
将整个记录复制到数组
找到特定记录之后,您可能希望提取数据,以便在不修改基础源表的情况下在应用程序中使用。

复制单个字段
可以将单个字段的记录复制到适当数据类型的变量。 下面的示例从 Recordset 对象的第一条记录中提取三个字段。

Dim dbsNorthwind As DAO.Database 
Dim rstEmployees As DAO.Recordset 
Dim strFirstName As String 
Dim strLastName As String 
Dim strTitle As String 
 
   Set dbsNorthwind = CurrentDb 
   Set rstEmployees = dbsNorthwind.OpenRecordset("Employees") 
 
   rstEmployees.MoveFirst 
   strFirstName = rstEmployees!FirstName 
   strLastName = rstEmployees!LastName 
   strTitle = rstEmployees!Title


将整个记录复制到数组
若要复制一条或多条记录,您可以创建一个二维数组,并一次复制一条记录。 您将为每个字段增加第一个下标,并为每个字段增加第二个下标。

快速执行此操作的方法是使用 GetRows 方法,该方法将返回一个二维数组。 第一个下标标识字段,第二个下标标识行号,如下所示。
varRecords(intField, intRecord)


下面的代码示例使用 SQL 语句从名为“Employees”的表中检索三个字段,放入 Recordset 对象中。 然后,它使用 GetRows 方法检索 Recordset 的前三条记录,并将所选的记录存储在一个二维数组中。 然后,它通过使用两个数组索引来选择特定字段和记录,从而输出每条记录(一次一个字段)。

为了显示数组索引的使用方式,以下示例使用一个单独的语句来标识和输出每条记录的每个字段。 在实践中,更加可靠的做法是:使用两个相互嵌套的循环,并为逐步执行数组的两个维度的索引提供整数变量。
Sub GetRowsTest() 
 
Dim dbsNorthwind As DAO.Database 
Dim rstEmployees As DAO.Recordset 
Dim varRecords As Variant 
Dim intNumReturned As Integer 
Dim intNumColumns As Integer 
Dim intColumn As Integer 
Dim intRow As Integer 
Dim strSQL As String 
 
On Error GoTo ErrorHandler 
 
   Set dbsNorthwind = CurrentDb 
   strSQL = "Select FirstName, LastName, Title FROM Employees" 
   Set rstEmployees = dbsNorthwind.OpenRecordset(strSQL, dbOpenSnapshot) 
 
   varRecords = rstEmployees.GetRows(3) 
   intNumReturned = UBound(varRecords, 2) + 1 
   intNumColumns = UBound(varRecords, 1) + 1 
 
   For intRow = 0 To intNumReturned - 1 
      For intColumn = 0 To intNumColumns - 1 
         Debug.Print varRecords(intColumn, intRow) 
      Next intColumn 
   Next intRow 
 
   rstEmployees.Close 
   dbsNorthwind.Close 
 
   Set rstEmployees = Nothing 
   Set dbsNorthwind = Nothing 
 
Exit Sub 
 
ErrorHandler: 
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description 
End Sub

如果有更多记录可用,请使用 对 GetRows 方法的 后续调用。 由于一旦调用 GetRows 方法,数组就会填满,因此您可以看到该方法为什么比一次复制一个字段要快得多。

另请注意,你不必将 Variant 声明为数组,因为当 GetRows 方法返回记录时,这会自动完成。 这样,您就可以在不知道将返回多少记录或字段的情况下使用固定长度数组维度,而不是使用占用更多内存的可变长度维度。

如果尝试使用多个 GetRows 调用检索所有行,请使用 EOF 属性,以确保位于 Recordset 的末尾。 GetRows 方法返回的行数可能比您请求的行数少。 举例来说,如果请求的行数超过 Recordset 中的剩余行数,则 GetRows 方法将只返回剩余的行。 同样,如果它无法检索所请求范围中的某行,则不会返回该行。

举例来说,如果无法检索您尝试检索的一组 10 条记录中的第五条记录,则 GetRows 方法将返回四条记录,并将当前记录位置保留在导致问题的记录上,且不会生成运行时错误。 如果另一个用户删除了动态集中的某个记录,则可能出现这种情况。 如果它返回的记录数比请求的数量少,并且您不在文件末尾,则需要阅读当前记录中的每个字段来确定 GetRows 方法遇到了什么错误。

由于 GetRows 方法始终返回 Recordset 对象中的所有字段,因此您可能想要创建一个仅返回所需字段的查询。 这对于“OLE 对象”和“备注”字段尤其重要。




Access软件网QQ交流群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助