【问题标题】:ADODB.Recordset: Operation is not allowed when the object is closedADODB.Recordset:对象关闭时不允许操作
【发布时间】:2016-05-06 05:09:30
【问题描述】:

我收到错误 - ADODB.Recordset: 对象关闭时不允许操作。使用多表sql语句时。

其他 sql 语句(简单的)我没有收到和错误,我已将 sql 语句复制到查询中,以验证它在 MSSQL 中从打印出的 sql 变量中正常工作 - 它确实返回值。

方法

sql = "SET NOCOUNT ON;SET ANSI_WARNINGS OFF;use dbcheck; " &_
"select year([00080020]) as YEAR, month([00080020]) as MONTH,sum(bytesize/1024/1024/1024) as GBStored, count(distinct [0020000d]) " &_
" as FinalCount from tblt t, tbls s, tblf f where" &_
" id1 = _id1 and id2 = _id2file" &_
" and [00080020] is not null" &_
" group by year([00080020]), month([00080020]) order by year([00080020]) desc, month([00080020]) desc"

Dim cndb : Set cndb = CreateObject("ADODB.Connection")
Dim rsdb: Set rsdb = CreateObject("ADODB.Recordset")
cndb.Provider = "sqloledb"
cndb.Properties("Data Source").Value = "127.0.0.1"
cndb.Properties("Initial Catalog").Value = "master"
cndb.Properties("Integrated Security").Value = "SSPI"

cndb.CursorLocation = 3
cndb.Open
set rsdb = CreateObject ("ADODB.Recordset")
cmd.ActiveConnection = cndb
cmd.CommandType = 1
cmd.CommandText = sql
rsdb.CursorLocation = 3
rsdb.CursorType = 3
rsdb.LockType = 3
Set rsdb = cmd.Execute
    IF Not (rsdb IS Nothing) Then
    rsdb.MoveFirst ** ERRORS OUT HERE

谢谢 --------第二次尝试sql是一样的

Dim cndb : Set cndb = CreateObject("ADODB.Connection")
Dim rsdb: Set rsdb = CreateObject("ADODB.Recordset")

cndb.Provider = "sqloledb"
' Set SQLOLEDB connection properties.
cndb.Properties("Data Source").Value = "127.0.0.1"
cndb.Properties("Initial Catalog").Value = "master"

' Windows NT authentication.
cndb.Properties("Integrated Security").Value = "SSPI"

cndb.CommandTimeout=900
cndb.CursorLocation = 3
cndb.Open

rsdb.CursorLocation = 3
rsdb.CursorType = 3
rsdb.LockType = 3
rsdb.Open sql,cndb

rptFile.WriteLine sql
rptFile.WriteLine cndb.State
rptFile.WriteLine rsdb.State

IF Not (rsdb IS Nothing) Then
  If Not rsdb.EOF Then  * Errors out on this line
    rsdb.MoveFirst

【问题讨论】:

标签: sql-server vbscript adodb


【解决方案1】:

我认为您收到的是一个空记录集。

Set rsdb = cmd.Execute
If Not (rsdb IS Nothing) Then
    rsdb.MoveFirst ** ERRORS OUT HERE

如果rsdb.EOF 返回True,您不能移至第一条记录。试试这个:

Set rsdb = cmd.Execute
If Not (rsdb Is Nothing) Then
    If Not rsdb.EOF Then
        rsdb.MoveFirst
        ...
    End If
End If

然后诊断您的查询并查看它是否实际上返回任何内容。这可能会有所帮助:

Echo sql

也就是说,您将记录集的引用设置了 3 次,并且每次都丢弃之前的引用。

Dim rsdb: Set rsdb = CreateObject("ADODB.Recordset")

Set 声明是多余的,因为...

cndb.Open
set rsdb = CreateObject ("ADODB.Recordset")

你又在这里设置了。但是Set 声明也是多余的,因为...

Set rsdb = cmd.Execute

这是唯一真正需要发生的引​​用分配。 CursorLocation 和您正在设置的其他属性与被丢弃的引用一起被丢弃。也删除它们。

【讨论】:

  • 我更改并删除了您提到的那些重复项,并将其放入 EOF 的 if 语句中。现在它在 If Not rsdb.EOF 行上出错,并出现相同的错误。我为 sql 输入了 write out - 检查结果很好并且 cndb.State=1, rsdb.State=0.
  • Debug.Print 不适用于 VBScript 使用 WScript.Echo
  • If Not (rsdb Is Nothing) Then 仍然存在同样的问题,因为 ADODB.Recordset 可能会被返回,但 State 属性为 adStateClosed
【解决方案2】:

我发现了我的问题 - 在我遇到的 SQL 语句中 使用数据库检查 尝试使用在 SQL QUERY ANALYZER 中工作的 use 语句来选择它 - 只是不在脚本中,我将初始目录更改为 dbcheck 并从 sql 中删除了“use”并且它起作用了。

感谢大家的帮助。

【讨论】:

  • USE 设置数据库上下文被 ADODB 视为已关闭记录集,因此您可以调用 Set rsdb = rsdb.NextRecordset 移动到下一个记录集对象,这将是您的查询结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多