VBA 中是不是有针对没有结果的 sql 查询的解决方法?

Posted

技术标签:

【中文标题】VBA 中是不是有针对没有结果的 sql 查询的解决方法?【英文标题】:Is there a workaround in VBA for sql queries with no results?VBA 中是否有针对没有结果的 sql 查询的解决方法? 【发布时间】:2015-04-04 00:58:01 【问题描述】:

我有一个 VBA 程序,其中的一部分查询我们的 SQL 服务器并返回特定数据。问题是数据不一定总是在那里,这是意料之中的。我需要查询数据库以获取特定数据,如果它不存在,那么我希望程序忽略它并继续前进。不幸的是,当我点击没有数据的记录时,我收到以下错误:

运行时错误“3021”: BOF 或 EOF 为 True,或者当前记录已被删除。

又名。没有记录。有没有办法,不使用错误,要么

    确定存在哪些数据,或者 只是让它返回一个空字符串/记录集/任何东西而不是错误?

【问题讨论】:

【参考方案1】:

这是在导航到打开的记录集之前测试 RecordCount/EOF 以确保记录集中有记录的需要。

Public Sub TestRS()
    Dim rsObj As DAO.Recordset

    Set rsObj = CurrentDB.OpenRecordset("SELECT FieldName1, FieldName2 FROM tableName WHERE someID = 10")

    If rsObj.RecordCount < 1 Then
        MsgBox "No Records."
        'You can also test using one of the following.
        'If Not (rsObj.BOF And rsObj.EOF) Then
    Else
        MsgBox "There are more than one Record."
    End If
    Set rsObj = Nothing
End Sub

【讨论】:

太棒了,完全忘记了 .recordcount 属性 我只想指出,recordcount 属性并不总是准确的,具体取决于您使用的 rdbms。我个人更喜欢使用If Not rsObj.EOF,因为您并不真正关心您是否在文件的开头,您只是不想在文件末尾工作。 @RubberDuck 据我所知,如果记录集中有记录 .RecordCount 总是返回>0,所以测试是正确的。但你是对的,要获得实际记录数,必须首先“填充”记录集。 @RubberDuck 的一个非常有效的声明,是的 RecordCount 将返回 -1 用于 ADO 设置,DAO 返回 0 用于 没有记录。但是,如果记录集返回某些内容,则计数将始终 > 1。所以我的检查条件 除非@MarekStejskal 提到,如果您真的想要返回的记录数,在检查BOF And EOFFalse .【参考方案2】:

在访问结果记录集中的任何字段值之前,您必须检查记录集是否位于 .EOF 或询问它的记录数。只是打开空记录集不会给你错误,访问它的记录会给出。

如果没有看到您的代码(从打开记录集开始),很难写出更具体的建议。

【讨论】:

以上是关于VBA 中是不是有针对没有结果的 sql 查询的解决方法?的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 查询的结果保存到 VBA 中的变量中?

使用 VBA 从 SQL Server 查询 VIEW

来自 Access 的 Excel VBA SQL 没有结果

Access-VBA SQL 查询数据库并使用结果更新 ListBox

VBA 包含 SQL 查询标头

如何将 SQL 结果放入 VBA 中的变量中