【问题标题】:EOF value is always true even if there is record returned from VBA SQL即使有从 VBA SQL 返回的记录,EOF 值也始终为真
【发布时间】:2018-03-17 23:09:22
【问题描述】:

我正在使用 VBA 查询我的访问表并将查询结果写入 excel。

EOF 始终为真,但 BOF 为假——即使记录数为 1 或 14 或 100。可能会出现什么问题?我可以看到记录数超过零。获取字符串值中有数据。因此,目标工作表中除了标题之外没有写入任何数据。标题很好。

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

  1. 添加了移动最后和移动第一个命令
  2. 尝试了光标位置、光标类型、锁定类型的所有可能组合
  3. 尝试使用执行命令
  4. 尝试使用不同的 MS 访问表
  5. 尝试过早期和晚期绑定技术

下面是我的查询,下面的链接是我的记录集在 SQL open 语句后的样子。

    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

调试时这是我的记录集的样子:

【问题讨论】:

  • 查看rs时您在哪一行?
  • ps。您已经为标题指定了一张工作表,但没有为记录指定。即尝试包括:Sheets("Search_Temp").Range("A2").CopyFromRecordset rs
  • 我在 rs.MoveFirst
  • 嗯好的;为什么你有rs.MoveLastrs.MoveFirst?我假设那是为了获得调试记录;是吗/您是否尝试过在不包含这些命令的情况下运行该命令? (无论如何应该可以工作,但看不到任何明显的错误......)。
  • 是的,我根据某个论坛的输入添加了先移动和后移动的那些。因为有人建议使用该命令将有助于重新计算完整的记录计数,并且位置将被纠正。唯一改变的是获取字符串值,因为它指向第一条和最后一条记录。没有其他变化

标签: sql vba ms-access eof


【解决方案1】:

this answer to a similar question 的基础上,对 Recordset 对象调用 getString 具有将记录集移动到 EOF 的副作用。

您没有在代码中的任何位置调用getString,但您已在rs.getString 上添加了一个监视,它作为监视窗口中的最后一个条目可见。如果您在 rs.getString 上有一个监视,并且您在代码中有一个断点 rs 打开,那么该断点将导致记录集移动到 EOF。

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

要解决此问题,请移除 rs.getString 上的手表。一般来说,让 Watches 窗口中的项目引起副作用可能是个坏主意。您还可以通过在记录集打开的位置不设置任何断点来避免此问题,但完全删除手表会更加健壮。

ADO documentation 中没有提到getString 将记录集移动到 EOF 的问题,但很容易重现此效果。

很少有人在问题中包含他们设置的整个手表列表,但如果没有这些信息,我不确定这个问题是否可以回答

【讨论】:

  • 谢谢 barrowc。这行得通。我猜 rs.getstring 上的手表导致 EOF 为真。我知道 rs.string 会弄乱光标指针,但我从来不知道代码结果会受到影响,即使你在 rs.getstring 上有手表。现在,当我在 rs.getstring 上执行删除手表时,EOF 正在正确设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 2023-02-14
相关资源
最近更新 更多