Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5508|回复: 14

[已解决]请问,.getrows为什么只能用一次?

[复制链接]
发表于 2013-5-19 17:26 | 显示全部楼层 |阅读模式
Line1:
     set Rst=***记录集
     Arr=Rst.getrows    'OK,没问题
     Brr=Rst.getrows    '就出错了
goto Line1
请问这是为什么?
最佳答案
2013-5-19 22:58
mansohu 发表于 2013-5-19 22:30
getrows 还是你教我的,谢谢了,要有参数吗?学是越学越深啊!有什么参数啊?

给你解决好多问题,你也不给个最佳,太桑心了,{:4812:}
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-5-19 17:40 | 显示全部楼层
在调用 GetRows 后,下一个未读取的记录成为当前记录,或者如果没有更多的记录,则 EOF 属性设置为 True。
回复

使用道具 举报

发表于 2013-5-19 17:42 | 显示全部楼层
要用GETROWS的时候,最好用用MOVEFIRST方法,然后再用GETROWS。
一旦EOF后,GETROWS方法就会报错的。
回复

使用道具 举报

发表于 2013-5-19 17:44 | 显示全部楼层
      set Rst=***记录集
      Arr=Rst.getrows    'OK,没问题
      RST.movefirst
      Brr=Rst.getrows    '就出错了
这里也不用需要不停的读,不加参数时,GETROWS会把当前游标开始的所有记录读出来的。
回复

使用道具 举报

 楼主| 发表于 2013-5-19 22:30 | 显示全部楼层
hwc2ycy 发表于 2013-5-19 17:44
set Rst=***记录集
      Arr=Rst.getrows    'OK,没问题
      RST.movefirst

getrows 还是你教我的,谢谢了,要有参数吗?学是越学越深啊!有什么参数啊?
回复

使用道具 举报

发表于 2013-5-19 22:54 | 显示全部楼层
将 Recordset 对象的多个记录恢复到数组中。

语法

array = recordset.GetRows( Rows, Start, Fields )

返回值

返回二维数组。

参数

Rows    可选,长整型表达式,指定要检索记录数。默认值为 adGetRowsRest (-1)。

Start    可选,字符串或长整型,计算得到在 GetRows 操作开始处的记录的书签。也可使用下列 BookmarkEnum 值。

常量 说明
AdBookmarkCurrent 从当前记录开始。
AdBookmarkFirst 从首记录开始。
AdBookmarkLast 从尾记录开始。


Fields   可选,变体型,代表单个字段名、顺序位置、字段名数组或顺序位置号。ADO 仅返回这些字段中的数据。

说明

使用 GetRows 方法可将记录从 Recordset 复制到二维数组中。第一个下标标识字段,第二个则标识记录号。当 GetRows 方法返回数据时数组变量将自动调整到正确大小。

如果不指定 Rows 参数的值,GetRows 方法将自动检索 Recordset 对象中的所有记录。如果请求的记录比可用记录多,则 GetRows 仅返回可用记录数。

如果 Recordset 对象支持书签,则可以通过传送该记录的 Bookmark 属性值,来指定 GetRows 方法将从哪个记录开始检索数据。

如要限制 GetRows 调用返回的字段,则可以在 Fields 参数中传送单个字段名/编号或者字段名/编号数组。

在调用 GetRows 后,下一个未读取的记录成为当前记录,或者如果没有更多的记录,则 EOF 属性设置为 True。
回复

使用道具 举报

发表于 2013-5-19 22:55 | 显示全部楼层
GetRows 方法范例
该范例使用 GetRows 方法从 Recordset 中检索指定数目的行,并将结果数据填充到数组。在两种情况下 GetRows 方法返回的行将少于所需的数目:一种情况是因为达到了 EOF,另一种情况是因为 GetRows 试图检索已被其他用户删除的数据。仅当第二种情况发生时函数将返回 False。运行该过程需要使用 GetRowsOK 函数。

Public Sub GetRowsX()

   Dim rstEmployees As ADODB.Recordset
   Dim strCnn As String
   Dim strMessage As String
   Dim intRows As Integer
   Dim avarRecords As Variant
   Dim intRecord As Integer

   ' 使用雇员表中的姓名和受雇日期打开记录集。
      strCnn = "rovider=sqloledb;" & _
      "Data Source=srv;Initial Catalog=pubs;User Id=saassword=; "
   Set rstEmployees = New ADODB.Recordset
   rstEmployees.Open "SELECT fName, lName, hire_date " & _
      "FROM Employee ORDER BY lName", strCnn, , , adCmdText

   Do While True
      ' 得到用户输入的行数。
      strMessage = "Enter number of rows to retrieve."
      intRows = Val(InputBox(strMessage))

      If intRows <= 0 Then Exit Do

      ' 如 GetRowsOK 成功则打印结果,请注意是否达到文件末端。
      If GetRowsOK(rstEmployees, intRows, _
            avarRecords) Then
         If intRows > UBound(avarRecords, 2) + 1 Then
            Debug.Print "(Not enough records in " & _
               "Recordset to retrieve " & intRows & _
               " rows.)"
         End If
         Debug.Print UBound(avarRecords, 2) + 1 & _
            " records found."

         ' 打印已检索的数据。
         For intRecord = 0 To UBound(avarRecords, 2)
            Debug.Print "  " & _
               avarRecords(0, intRecord) & " " & _
               avarRecords(1, intRecord) & ", " & _
               avarRecords(2, intRecord)
         Next intRecord
      Else
         ' 假定 GetRows 错误源于其他用户对数据的更改,
         ' 使用 Requery 刷新 Recordset 并重新开始。
         If MsgBox("GetRows failed--retry?", _
               vbYesNo) = vbYes Then
            rstEmployees.Requery
         Else
            Debug.Print "GetRows failed!"
            Exit Do
         End If
      End If

      ' 由于使用 GetRows 使当前记录指针指向访问过的最后一个记录,
      ' 所以,在循环回到另一次搜索前将记录指针移回 Recordset 的开始。
      rstEmployees.MoveFirst
   Loop

   rstEmployees.Close

End Sub

Public Function GetRowsOK(rstTemp As ADODB.Recordset, _
   intNumber As Integer, avarData As Variant) As Boolean

   ' 将 GetRows 方法的结果保存在数组中。
   avarData = rstTemp.GetRows(intNumber)
   ' 仅当返回的行数少于所需的行数而非由于到达了 Recordset 末端时才返回 False。
   If intNumber > UBound(avarData, 2) + 1 And _
         Not rstTemp.EOF Then
      GetRowsOK = False
   Else
      GetRowsOK = True
   End If

End Function

评分

参与人数 1 +3 收起 理由
mansohu + 3 为什么只有下一个回复是最佳答案?这个很好

查看全部评分

回复

使用道具 举报

发表于 2013-5-19 22:58 | 显示全部楼层    本楼为最佳答案   
mansohu 发表于 2013-5-19 22:30
getrows 还是你教我的,谢谢了,要有参数吗?学是越学越深啊!有什么参数啊?

给你解决好多问题,你也不给个最佳,太桑心了,{:4812:}
回复

使用道具 举报

 楼主| 发表于 2013-5-20 05:21 来自手机 | 显示全部楼层
hwc2ycy 发表于 2013-5-19 22:58
给你解决好多问题,你也不给个最佳,太桑心了,

啥是最佳?当然应该给,怎么给啊,我肯定给啊!
回复

使用道具 举报

发表于 2013-5-20 06:45 | 显示全部楼层
mansohu 发表于 2013-5-20 05:21
啥是最佳?当然应该给,怎么给啊,我肯定给啊!

在你觉得答案正确的楼层点击 设置为最佳答案 即要。

QQ五笔截图未命名.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-19 09:47 , Processed in 0.400837 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表