了解测试ADO记录集是否打开

时间:2018-09-12 12:51:20

标签: vba ado

我一直在寻找一种方法来知道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值以外的值的情况?

谢谢!

2 个答案:

答案 0 :(得分:0)

实际上,您已经回答了自己的问题:由于存在五个不同的状态,所以这两个不相等,其中adStateOpen(= 1)是第一种语法允许关闭对象的唯一状态。您可能不希望在执行或提取等操作时关闭对象(例如在“打开并执行”中:adStateOpen + adStateExecuting = 1 + 4 = 5)

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

答案 1 :(得分:0)

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

ObjectStateEnum

writer.writerows([x.encode('utf-8') for x in sheet.row_values(row)] for row in range(sheet.nrows))

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