【问题标题】:Understand testing if a ADO recordset is open了解测试 ADO 记录集是否打开
【发布时间】:2018-10-19 00:30:44
【问题描述】:

我一直在寻找一种方法来了解 ADO 记录集是否打开。我找到了this,在那里我遇到了语法:

If Not (rs Is Nothing) Then
  If (rs.State And 1) = 1 Then rs.Close
  Set rs = Nothing
End If

我阅读了@Raybarg 发布的解释,但是我有以下问题: 语法:

If Not (rs Is Nothing) Then
  If rs.State > 0 Then rs.Close
  Set rs = Nothing
End If

不等价?可能存在 Recordset 存在但.State 属性返回的不是ObjectStateEnum 值的情况?

谢谢!

【问题讨论】:

  • 你在什么环境下使用这个?根据 Recordset 的状态,如果 ObjectStateEnum > adStateOpen 尝试关闭它可能会引发错误。
  • 可能存在 Recordset 存在但 .State 属性返回的不是 ObjectStateEnum 值的情况?这真的是你的问题吗?
  • 我通常使用条件If rs.State > 0 Then rs.Close,我想知道这是否可以返回超出预期的其他结果。为此,我尝试理解问题......如果两个代码是等价的,情况就解决了。

标签: vba ado


【解决方案1】:

实际上,您已经回答了自己的问题:两者并不等价,因为有五种不同的状态,其中adStateOpen (= 1) 是第一种语法允许关闭对象的唯一一种。您可能不想在 Executing 或 Fetching 等时关闭对象(如在 Open and Executing 中:adStateOpen + adStateExecuting = 1 + 4 = 5)

x AND 1 = 1 仅当 x=1 时,否则 x AND 1 = 0 用于任何其他 x 值。也就是说,在第一个语法示例中,只需测试 If rs.State = 1 Then rs.Close 就足够了。

【讨论】:

  • 我不确定x AND 1 = 1 only if x = 1!在this post 的示例中,我发现:'ex. If (0001 And 0001) = 0001 (only open flag) -> true  'ex. If (1001 And 0001) = 0001 (open and retrieve) -> true  'This second example means that it is open, but its value is not 1 and if rs.State = 1 -> false, even though it is open
  • @Raybarg 在那篇文章中说这是因为它是按位And 操作。另一方面,当您可能想要关闭对象时,Recordset 关闭行通常位于错误处理或退出区域,即使执行或获取也是如此。
  • @Cip 在这个对话中说“我不确定只有在 x = 1 时 x AND 1 = 1!”是没有任何意义的。测试它需要几秒钟。这些标志确实设计为二进制:adStateOpen = 1 = 0b0001, adStateFetching = 8 = 0b1000;这样,您只需升高或降低适当的位以指示适当的状态组合:adStateOpen + adStateFetching = 0b1001... 一般而言,它是电气工程,网络。但这与您的问题有什么关系?!!!
  • 1 我测试过:声明 x AND 1 = 1 only if x=1 对于所有奇数都是 FALSE。 2 重新表述的问题:在什么条件下,rs.State > 0 可以具有比 (rs.State And 1) = 1 另一个值的真值
  • @Cip 哦,来吧!第一个是True,如果rs 没有关闭(无论发生什么其他情况),而第二个是True,前提是rs 是打开的并且没有其他事情发生:)
【解决方案2】:

通常,每个位都可以单独设置,因此检查第一种方式可确保设置了打开标志。也许您认为没有任何情况下状态未打开,因为其他状态是打开状态的修饰符。让我们看一下 RecordSet.State 的 MS API 参考。它拥有一个叫做 ObjectStateEnum 的东西。我们可以看到有一种状态不是打开也不是关闭,称为“连接”。您的第二种方法将尝试关闭处于连接状态的连接,而第一种方法不会。这是我能看到的唯一功能差异。

ObjectStateEnum

Constant            Value   Description
--------            -----   -----------
adStateClosed       0       Indicates that the object is closed.
adStateOpen         1       Indicates that the object is open.
adStateConnecting   2       Indicates that the object is connecting.
adStateExecuting    4       Indicates that the object is executing a command.
adStateFetching     8       Indicates that the rows of the object are being retrieved.

来源: https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/objectstateenum?view=sql-server-2017

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    相关资源
    最近更新 更多