我一直在寻找一种方法来知道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值以外的值的情况?
谢谢!
答案 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的东西。我们可以看到有一种状态处于未打开和未关闭状态,称为“正在连接”。您的第二种方法将尝试关闭处于“连接”状态的连接,而第一种方法则不会。这是我唯一看到的功能差异。
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