ADODB.Recordset:关闭对象时不允许操作

时间:2016-05-05 17:28:00

标签: sql-server vbscript adodb

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

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

方法

PriorMonthSales =CALCULATE(
SUM(Table[Sales]),
FILTER(
   Table[TeamID]&&
   Table[Date] - 1
 )

PriorQuarterSales =CALCULATE(
SUM(Table[Sales]),
FILTER(
   Table[TeamID]&&
   Table[Date] - 3
 )

PriorSales = IF(Table[PaymentType] = "Monthly",PriorMonthSales,   PriorQuarterSales)

由于 --------第二次尝试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

2 个答案:

答案 0 :(得分: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和其他属性将与丢弃的引用一起丢弃。也删除它们。

答案 1 :(得分:1)

我发现了我的问题 - 在我所拥有的SQL语句中 使用dbcheck 尝试使用在SQL QUERY ANALYZER中使用的use语句选择它 - 只是不在脚本中,我将初始目录更改为dbcheck并从sql中删除了“use”并且它有效。

感谢大家的帮助。