VBA数据库解决方案第15讲:利用VBA代码对Recordset集合中的单个数据精确处理

论坛 期权论坛 期权     
VBA语言专家   2019-6-16 04:31   2375   0
点蓝字关注,回复“VBA”获取专业资料

《VBA代码解决方案》系列书作者
头条百家平台 VBA资深创作者
_______________________________


大家好,今天给继续讲解VBA数据库解决方案的第15讲:Recordset集合的单个数据精确处理,在前几讲中,我们讲了对于Table的对象的添加和删除。今天我们要讲的内容是Recordset集合的处理方案,这个处理和Table的处理是关系紧密的,在第10讲中我们讲了利用下面的语句实现Recordset集合内容的可视化导出:Range("A2").CopyFromRecordsetrsADO,那么是否还有其他的办法能精确的控制导出的内容呢?
比如我只需要其中几个字段的记录,该如何处理呢?这时我们需要对Recordset集合的详细的数据处理了,也就是说要通过循环语句把每一个数据都要遍历到。
一 为了达到对Recordset集合数据的详细处理,我们先看看记录集的MoveFirs,MoveLast,MoveNext,MovePrevious系列的方法:
1  MoveFirst方法
作用是:将记录指针移动到记录集中的第一条记录。它以第一条记录作为当前记录。
注意:当记录集为空时,请求MoveFirst或MoveLast将产生一个错误。
2  MoveLast方法
作用是:将记录指针移动到记录集中的最后一条记录。它以最后一条记录作为当前记录。
注意:当记录集为空时,请求MoveFirst或MoveLast将产生一个错误。
注意:如果记录集对象不支持书签或不能向后移动指针,那么将产生错误。
3  MoveNext方法
作用是:将记录指针移动到记录集中的下一条记录。它以下一条记录作为当前记录。
注意:当当前记录指针位于最后一条记录时,如果你请求这个方法,将产生错误。
4  MovePrevious方法
作用是:将记录指针移动到记录集中的上一条记录。它以上一条记录作为当前记录。
注意:如果记录集对象不支持书签或不能向后移动指针,那么将产生错误。.
注意:当当前记录为记录集中第一条记录时,如果你请求该方法,那么它将产生一个错误。
由此我们还要判断记录集是否为首位还要判断,这时是通过般需要通过Recordset对象的EOF属性先进行判断游标是否到了记录尾。当游标到了记录尾时,EOF属性会被设置为True。
同理可以通过Recordset对象的BOF属性先进行判断游标是否到了记录首。当游标到了记录首时,BOF属性会被设置为True。
二今日要讲的代码就是利用上面的方法达到精准控制记录集导出,如下面的数据库的数据,我们要导出部门为“一厂”的职工目录,该如何做到呢?


代码如下:
Sub mynzRSCT()
  Dim cnADO, rsADO As Object
   Dim strPath, strSQL As String
   Dim i As Integer
   Set cnADO = CreateObject("ADODB.Connection")
   Set rsADO = CreateObject("ADODB.RecordSet")
   strPath = ThisWorkbook.Path & "\mydata2.accdb"
   cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="& strPath
   strSQL = "SELECT * FROM 员工信息 WHERE 部门='一厂'"
   rsADO.Open strSQL, cnADO, 1, 3
   For i = 0 To rsADO.Fields.Count - 1
       Sheets("Sheet1").Cells(1, i + 1) = rsADO.Fields(i).Name
   Next i
   For i = 1 To rsADO.RecordCount
   For j = 0 To rsADO.Fields.Count - 1
     Sheets("Sheet1").Cells(i + 1, j + 1) = rsADO.Fields(j)
   Next j
   rsADO.MoveNext
   Next i
   rsADO.Close
   cnADO.Close
   Set rsADO = Nothing
   Set cnADO = Nothing
End Sub
代码截图:


代码解析:
1  SetcnADO = CreateObject("ADODB.Connection")
   Set rsADO = CreateObject("ADODB.RecordSet")
   strPath = ThisWorkbook.Path & "\mydata2.accdb"
cnADO.Open"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath
上述代码先建立ADO 和RS 对象并打开
2  strSQL= "SELECT * FROM 员工信息 WHERE 部门='一厂'"
rsADO.OpenstrSQL, cnADO, 1, 3
上述语句,建立一个SQL语句并打开
3 For i = 0 To rsADO.Fields.Count - 1
       Sheets("Sheet1").Cells(1, i + 1) = rsADO.Fields(i).Name
Next i
表头计入
4  Fori = 1 To rsADO.RecordCount
    For j = 0 To rsADO.Fields.Count - 1
      Sheets("Sheet1").Cells(i + 1, j + 1) = rsADO.Fields(j)
    Next j
    rsADO.MoveNext
Next i
数据内容计入,这个是今日内容的重点,这种方法的操作数据是一个一个计入的。对于记录集的指针转到下一个记录一定要用rsADO.MoveNext 移动记录。
5  rsADO.Close
   cnADO.Close
   Set rsADO = Nothing
   Set cnADO = Nothing
关闭连接,释放内存。
看下面的输出结果:


通过记录集的精准控制,可以完成具体到每个数据的判断,应用是非常灵活的,
今日内容回向:
1 MoveFirs,MoveLast,MoveNext,MovePrevious 方法的意义是否理解呢?
2  如何实现记录的精确控制?

_____________________________

觉得有启发,点个“在看”,转给朋友们
欢迎你“留言”,和作者直接交流

更多关联阅读








  





分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:200
帖子:40
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP