【问题标题】:How do I test if a recordSet is empty? isNull?如何测试记录集是否为空?一片空白?
【发布时间】:2011-10-11 05:00:03
【问题描述】:

如何测试记录集是否为空?

        Dim temp_rst1 As Recordset
        Dim temp_rst2 As Recordset

        Set temp_rst1 = db.OpenRecordset("SELECT * FROM ORDER_DATA WHERE SKUS_ORDERED = '" & curSKU1 & "' AND [ORDER] = " & curOrder)
        Set temp_rst2 = db.OpenRecordset("SELECT * FROM ORDER_DATA WHERE SKUS_ORDERED = '" & curSKU2 & "' AND [ORDER] = " & curOrder)

        If IsNull(temp_rst1) Or IsNull(temp_rst2) Then MsgBox "null"

我正在根据一个 select 语句打开几个记录集。如果没有记录,IsNull 会返回 true 吗?

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    我会检查“文件结束”标志:

    If temp_rst1.EOF Or temp_rst2.EOF Then MsgBox "null"
    

    【讨论】:

    • 根据您打开记录集的方式,您可能还想尝试是否同时记录集的开头和结尾(即为空)。然后,您将测试 recordSet.EOF 和 recordSet.BOF。
    • 如果 RecordSet 返回 1 行数据,那么 BOF 和 EOF 是否都为真?我遵循了下面的@tom-studee 建议,然后我检查了RecordCount > 0。
    • @JayKilleen:不。如果记录集包含单行数据,它将以 .BOF = False 和 .EOF = False 打开。如果您从那时开始执行 .MovePrevious,则 .BOF = True 且 .EOF = False。如果您从开始点执行 .MoveNext,则 .BOF = False 和 .EOF = True。有意义吗?
    • 如果记录集要更新或插入如何检查呢?和 EOF 一样吗?
    • @Sam,我不太确定你在这里问什么。请澄清或打开一个新问题,可选择提供此问题的链接。
    【解决方案2】:

    RecordCount 是您想要使用的。

    If Not temp_rst1.RecordCount > 0 ...
    

    【讨论】:

    • 同意。这允许您在知道从查询尝试返回的记录的基础上更改您的处理,以便您可以相应地更改处理。 +1
    • 请注意,在这种情况下,RecordCount 可能无法为您提供准确的总记录数。您需要执行 .MoveLast 以获得准确的计数(如果您想在记录集中移动,则需要执行 .MoveFirst)。也就是说,如果有 any 记录,它将大于 0。最重要的是,这个答案有效,但您需要了解 .RecordCount 的特质。
    • DAO 记录计数对于空记录集永远不会不准确。绝不。也就是说,如果它为零,您就知道它是空的并且不会改变。这是 100% 可靠的,并且一直如此。此外,如果它是任何大于 0 的数字,您就知道它是一个非空记录集——100% 可靠。因此,没有任何理由调用 .MoveLast 的开销来确定 Recordset 是否为空。
    • If temp_rst1.RecordCount <> 0 不会更简单吗?
    • -1: Recordcount > 0 根本不适用于某些 ODBC 附加表,因为它可能返回 -1。 <>0 可以工作,但在具有数百万行的 Oracle 表上可能需要很长时间。
    【解决方案3】:

    如果 temp_rst1.BOF 和 temp_rst1.EOF 则记录集为空。对于空记录集、链接的或本地的,这始终是正确的。

    【讨论】:

      【解决方案4】:

      一个简单的方法就是这样写:

      Dim rs As Object
      Set rs = Me.Recordset.Clone
      If Me.Recordset.RecordCount = 0 then 'checks for number of records
         msgbox "There is no records" 
      End if
      

      【讨论】:

        【解决方案5】:

        如果不是 temp_rst1 什么都不是,那么 ...

        【讨论】:

        • 那行不通。在这种情况下, temp_rst1 将永远不会成为任何东西,因为它在前两行被设置。 OP 对他的记录集中是否有记录感兴趣。其他两个答案中的任何一个都可以做到这一点。
        • 它与 ADO 一起正常工作。我不确定它是否适用于 DAO。我在 ADO 中广泛使用它,格式如下:Set temp_rst1 = temp_rst1.NextRecordset If Not temp_rst1 Is Nothing Then...
        • 我明白了。我对 ADO 做的很少,所以我会听从你那里的专业知识。通常建议在 MS Access VBA 中使用 DAO,所以我认为那是 OP 运行的环境。
        • 这个答案非常有帮助,因为它解释了如何测试 DAO.Recordset 变量是否已被赋值。
        【解决方案6】:

        在这里,我使用的是 MS Access 2016,我使用以下方法检查记录集字段是否为空:

        If (RecordSt.Fields("field_name").Value) Then
        ' do what you want if there is returned data
        Else 
        ' do what you want if there isn't any data returned by the select
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-14
          • 2011-02-27
          • 2011-09-17
          • 2014-03-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多