VB6 ADODB.Recordset Record.Count 不起作用/EOF 和 BOF 不可用

VB6 ADODB.Recordset Record.Count doesn't work / EOF & BOF not available

我有一个关于 VB6 中的 ADODB 记录集的问题,这让我困惑了几个星期。我已经将记录集写入工作表以实现一些我无法直接从记录集中获得的结果。 但是随着数据集的增加,将记录集写入工作表会减慢程序速度,我想知道是否有人可以为我解决记录集难题。

以下是我遇到的问题 - 1) xRst.Recordcount 总是 returns -1 2) 错误消息 "Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another" 在将 (A) .cursorlocation 设置为 adUseClient 或 adUseServer 和 (B) .LockType 时弹出 3) 无法在记录集上获取行 => 我相信这与 xRst.Recordcount 返回 -1 的原因相同?

下面是我的部分代码。以上问题会不会是提供商的限制导致的?

xConnstring = "Provider=Microsoft.ACE.OLEDB.12.0; Extended Properties='Excel 12.0'; Data Source =" & Thisworkbook.fullname
xCnn.Open xConnstring
xSqlstring = " SELECT * FROM [APRI$] "
Set xRst = xCnn.Execute(xSqlstring)
Msgbox(xRst.RecordCount)
Do Until xRst.EOF
     ......
     xRst.MoveNext
Loop

对于recordset,我也试过两种打开方式,都没有用。

Set xRst.ActiveConnection = xCnn
xRst.Source = xSqlstring
xRst.CursorType = adOpenDynamic
------Error Message Occurs On Below Two Lines------
xRst.CursorLocation = adUseServer
xRst.LockType = adLockOptimistic
xRst.Open

下面的代码会遇到错误,但去掉最后两个参数后会通过

xRst.Open xSqlstring, xCnn, adOpenKeyset, adUseServer, adLockoptimistic

有人可以告诉我如何获得 1) recordset.recordcount、2) recordset.movenext 的工作吗?

提前致谢。

默认光标类型为 adOpenForwardOnly。对于 adOpenForwardOnly 或 adOpenUnspecified,记录计数始终返回为 -1。使用 adOpenKeySet 或 adOpenStatic。即:(我假设 sheet 名称 APRI 是正确的而不是 APRIL - 并且有一个名为 Dummy 的工作sheet 列出测试结果):

Dim xCnn As ADODB.Connection
Dim xRst As ADODB.Recordset
Dim xConnString As String

xConnString = "Provider=Microsoft.ACE.OLEDB.12.0; Extended Properties='Excel 12.0'; Data Source =" & ThisWorkbook.FullName
Set xCnn = New ADODB.Connection
xCnn.Open xConnString
xSqlstring = " SELECT * FROM [APRI$] "
Set xRst = New ADODB.Recordset
xRst.Open xSqlstring, xCnn, adOpenStatic
MsgBox (xRst.RecordCount)
Dim row As Integer
row = 1
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Dummy")
Do Until xRst.EOF
    '...
    ws.Cells(row, 1).Value = xRst.Fields(0).Value
    row = row + 1
     xRst.MoveNext
Loop