我有一个传递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>
答案 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