无法多次打开ADO Recordset

时间:2015-05-26 15:03:12

标签: vba excel-vba excel

我有一个传递SQL字符串的函数,查询SQL服务器,并通过数组返回结果。这个功能第一次完美运行,但我试着再次调用它得到:

  

关闭对象时不允许操作

奇怪的是,这个错误发生在Open语句之后。我用Google搜索了我能想到的一切,没有取得好成绩。

<head typeof="schema:WebSite">
  <title property="schema:name">Beispiel</title>
  <link property="schema:url" rel="canonical" href="http://example.com/de/" />
</head>

3 个答案:

答案 0 :(得分:0)

如果我正确阅读 - 你再次打开SQL连接,而不是记录集(SQLrs)。每次打开和关闭时都必须创建一个新实例,或者在重新运行时都会遇到这些问题。

答案 1 :(得分:0)

我个人没有经历过,但我被告知Dim x as NEW y会导致问题。

尝试此更改以查看是否有帮助:

Public Function SQL_Query(SQLCommand As String) As Variant
    'changes here vvvvvvvv
    Dim cn As ADODB.Connection
    Dim SQLrs As ADODB.Recordset

    Set cn = New ADODB.Connection
    Set SQLrs = New ADODB.Recordset
    'to here ^^^^^^^^^^^^^^

    cn.ConnectionString = "Provider=SQLNCLI11;Server=10.XXX.XXXX.XXX;DataBase=Database1;Trusted_Connection=yes;"
    cn.Open
    SQLrs.CursorLocation = adUseClient
    Call SQLrs.Open(SQLCommand, cn, adOpenStatic, adLockBatchOptimistic)

    SQLrs.MoveFirst

    SQL_Query = RecordSet2Array(SQLrs.GetRows)

    SQLrs.Close
    Set SQLrs = Nothing
    cn.Close
    Set cn = Nothing

End Function

答案 2 :(得分:0)

所以,我终于跟踪了我在第二次调用函数时使用的SQL查询。它创建临时表并从该临时表返回记录。这显然是known issue。但是SET NOCOUNT ON可以很容易地纠正它。所以我已经将我的代码更新为以下内容,现在一切正常。

Public Function SQL_Query(SQLCommand As String) As Variant
    Dim cn As New ADODB.Connection
    Dim SQLrs As New ADODB.Recordset

    cn.ConnectionString = "Provider=SQLNCLI11;Server=10.XXX.XXXX.XXX;DataBase=Database1;Trusted_Connection=yes;"
    cn.Open
    cn.Execute "SET NOCOUNT ON"
    SQLrs.CursorLocation = adUseClient
    Call SQLrs.Open(SQLCommand, cn, adOpenStatic, adLockBatchOptimistic)

    SQLrs.MoveFirst

    SQL_Query = RecordSet2Array(SQLrs.GetRows)

    SQLrs.Close
    Set SQLrs = Nothing
    cn.Close
    Set cn = Nothing

End Function
相关问题