【问题标题】:Querying DB with ADODB Always Shows Error 'Either BOF or EOF is True, or the current record has been deleted'使用 ADODB 查询 DB 总是显示错误 'BOF 或 EOF 为真,或当前记录已被删除'
【发布时间】:2018-07-29 19:28:13
【问题描述】:

我可以使用 DAO 方法获取数据,但在我目前的公司中,IT 部门禁止我添加 ADO 以外的引用。所以我想使用 ADODB 方法从 Query 中获取数据。 这些数据将作为 ListView 的行源数据。

这是我的代码。

Private Sub FillListView()

    Dim rs As New ADODB.Recordset
    Dim strSQL As String
    Dim lstItem As ListItem
    Dim strSQL As String

    strSQL = "SELECT * FROM qrySavedQuery"
    rs.Open strSQL, CurrentProject.Connection

    With Me.ListView1
        'Set ListView Style
        .View = lvwReport
        .GridLines = True
        .FullRowSelect = True
        'Clear Headers and List Items
        .ListItems.Clear
        .ColumnHeaders.Clear
    End With

    'Setup Column Headers
    With Me.ListView1.ColumnHeaders
        .Add , , "Col1", 1000, lvwColumnLeft
        .Add , , "Col2", 2000, lvwColumnCenter
        .Add , , "Col3", 1000, lvwColumnCenter
        .Add , , "Col4", 1000, lvwColumnCenter
        .Add , , "Col5", 1700, lvwColumnCenter
        .Add , , "Col6", 800, lvwColumnCenter
        .Add , , "Col7", 1000, lvwColumnCenter
    End With

    rs.MoveFirst
    Do Until rs.EOF
        Set lstItem = Me.ListView1.ListItems.Add()
        lstItem.Text = rs!col1
        lstItem.SubItems(1) = rs!col2
        lstItem.SubItems(2) = rs!col3
        lstItem.SubItems(3) = rs!col4
        lstItem.SubItems(4) = rs!col5
        lstItem.SubItems(5) = rs!col6
        lstItem.SubItems(6) = rs!col7
        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
End Sub

从 Load Event 调用上面的例程,ListView 根本没有显示任何数据(错误'BOF 或 EOF 为 True,或者当前记录已被删除')

如果我使用 DAO 方法进行更改,一切都会好起来的。查询中的所有数据都可以毫无问题地获取。

我做错了什么?这个错误是因为我使用的是查询而不是表吗?如果是,我该怎么办?

编辑

我的查询

SELECT t2.col1, t2.[pmu-sn] & "/" & t2.[seedcheck_id] AS col2, 
Nz(t2.[amount],0)-Nz(t3.[delivery_amount],0) AS col3, t4.col4,
t4.col5, t4.col6, t4.col7
FROM (t1 INNER JOIN (t2 LEFT JOIN t3 ON t2.seedcheckdtl_id = t3.seedcheckdtl_id) ON t1.[pmu-sn] = t2.[pmu-sn]) INNER JOIN t4 ON (t2.[pmu-sn] = t4.[pmu-sn]) AND (t1.[pmu-sn] = t4.[pmu-sn])
WHERE (((Nz([amount],0)-Nz([delivery_amount],0))<>0) AND ((t2.seedcheck_id) Like "*-PC*"))
ORDER BY t1.pmu_bunch_id, t2.[pmu-sn] & "/" & [seedcheck_id], t2.[pmu-sn], t2.seedcheck_id;

希望这有助于找到问题。

编辑

图片取自我的办公室电脑。里面没有DAO文件夹。未经 IT 部门批准,我不能复制它。 顺便说一句,我在自己的笔记本电脑(也是 Office 2013)中创建了 Access 应用程序。

【问题讨论】:

  • 您的查询是否包含从报表或表单中获取的用户定义函数或参数?也许共享查询会有所帮助。
  • 但在我目前的公司,IT 部门禁止我添加 ADO 以外的参考 - 他们疯了吗? DAO 是 Access 中的本机数据访问库(除了 ca. Access 2000)。
  • 添加到 Andre 的反应中,您不需要添加引用即可使用 DAO。它是 Access 原生的,因此您始终可以在 Access 中使用它。
  • @y2a 我相信它相当于IIF(t2.[amount] IS NOT NULL, t2.[amount], 0)
  • 这是.accdb,不是.mdb,对吧?该引用列表中应该有Microsoft Office 15.0 Access database engine Object Library - 选中并取消选中旧的DAO 3.6

标签: ms-access vba ado adodb


【解决方案1】:

尝试添加:

rs.MoveLast

在您的 rs.MoveFirst 之前

这将遍历整个记录集并正确放置光标。我似乎记得这样做会缓解您遇到的问题...

【讨论】:

  • 试试看还是不行。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多