即使存在从VBA SQL返回的记录,EOF值也始终为true

Vim*_*mal 4 sql vba excel-vba eof access

我正在使用VBA查询访问表并在excel中编写查询结果.

EOF始终为真,但BOF为假 - 即使记录数为1或14或100.可能会出错?我可以看到记录数超过零.get string值包含数据.因此,除了标题之外,目标表中没有写入数据.标题很好.

尝试的事项列表但结果仍然相同:

  1. 添加了Move last和Move first命令
  2. 尝试了光标位置,光标类型,锁定类型的所有可能组合
  3. 尝试执行命令
  4. 试过不同的MS访问表
  5. 尝试早期和晚期绑定技术

下面是我的查询和下面的链接是我的记录集如何看待SQL打开语句.

    Const MyConn = "Access DB location"
    Dim con As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set con = New ADODB.Connection
    With con
      .Provider = "Microsoft.ACE.OLEDB.12.0"
      .Open MyConn
    End With

    QuerySql = "SELECT * FROM Store_Location"

    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.Open QuerySql, con, adOpenStatic, adLockReadOnly, adCmdUnknown
    rs.MoveLast
    rs.MoveFirst


    i = 0  
    For i = 0 To rs.Fields.Count - 1
        Sheets("Search_Temp").Cells(1, i + 1) = rs.Fields(i).Name
    Next i

    Range("A2").CopyFromRecordset rs  


    rs.Close
    Set rs = Nothing
    con.Close
    Set con = Nothing
Run Code Online (Sandbox Code Playgroud)

调试时,我的记录集如下:

调试

bar*_*owc 7

对类似问题的这个答案的基础上,调用getStringRecordset对象具有将记录集移动到EOF的副作用.

您不需要getString在代码中的任何位置调用,但是您添加了一个手表,rs.getString该手表作为Watches窗口中的最后一个条目可见.如果您有一个监视rs.getString并且代码中有一个断点,rs那么该断点将使记录集移动到EOF.

根据断点发生的位置,这可能不会导致任何问题(例如,如果记录集已经处于EOF),但在这种情况下,它会在您从记录集复制数据之前将记录集移动到EOF.

要解决此问题,请取消手表rs.getString.一般来说,在Watches窗口中有项目会产生副作用,这可能是一个坏主意.你也可以通过没有记录集打开的任何断点但完全删除手表来避免这个问题.

ADO文档中getString未提及将记录集移动到EOF 的问题,但很容易重现此效果.

有人将他们在问题中设置的整个手表列表包括在内并不常见,但我不确定这个问题是否在没有这些信息的情况下是可以回答的