2016-05-05 13 views
2

Ich erhalte den Fehler - ADODB.Recordset: Der Vorgang ist nicht erlaubt, wenn das Objekt geschlossen wird. bei Verwendung einer SQL-Anweisung für mehrere Tabellen.ADODB.Recordset: Der Vorgang ist nicht erlaubt, wenn das Objekt geschlossen wird

andere SQL-Anweisungen (einfache) Ich nicht erhalten und Fehler, und ich habe die SQL-Anweisung in Abfrage kopiert, um zu überprüfen, es funktioniert in MSSQL von ausgedruckten SQL-Variable - und es gibt Werte zurück.

Methode

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 

Dank -------- 2. Versuch SQL gleiche

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 
+1

haben Sie rsb.open ausprobiert? –

+1

Sollte nicht die 'ActiveConnection' * gesetzt sein, da es sich um eine Objektreferenz handelt? 'Set cmd.ActiveConnection = cndb' –

+0

Ich begann mit rsdb.open und spielte mit anderen Methoden. Ich änderte es mit demselben Problem zurück. Ich habe auch die cmd.ActiveConnection ohne Glück ausprobiert. Schätze die Ideen, um es zu versuchen. – Rick

Antwort

1

Ich glaube, ein leeres Re-Cord sind zu empfangen.

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

Sie können nicht Umzug zum ersten Datensatz wenn rsdb.EOF kehrt True. Versuchen Sie folgendes:

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

Und dann Ihre Abfrage diagnostizieren und sehen, ob es tatsächlich etwas zurückgibt. Dies könnte helfen:

Echo sql 

Das heißt, du bist der Datensatzgruppe des Referenz 3 mal einstellen, und jedes Mal, wenn die vorherige Referenz zu verwerfen.

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

Das Set Erklärung überflüssig ist, weil ...

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

sind Sie hier Einstellung wieder. Aber die Set Aussage ist auch überflüssig, weil ...

Set rsdb = cmd.Execute 

Das ist die einzige Referenzzuordnung, die tatsächlich benötigt passieren. Die CursorLocation und andere Eigenschaften, die Sie festlegen, werden zusammen mit der verworfenen Referenz verworfen. Entferne sie auch.

+0

Ich habe die von Ihnen erwähnten Duplikate umgestellt und entfernt und die if-Anweisung für EOF eingefügt. Jetzt es auf dieser If Not rsdb.EOF Zeile mit demselben Fehler aus. Ich schreibe aus für sql - check out gut und cndb.State = 1, rsdb.State = 0. – Rick

+0

'Debug.Print' funktioniert nicht für VBScript verwenden' WScript.Echo'. – Lankymart

+0

@Lankymart oh wow, stecken in VBA Land. Danke, bearbeitet. –

1

ich mein Problem gefunden - in der SQL-Anweisung I Verwendung dbcheck hatte versucht, um es auszuwählen mit use-Anweisung in SQL Query Analyzer gearbeitet - nur nicht im Skript, änderte es den Initial Catalog entfernt DBCheck und die " benutze "von SQL und es hat funktioniert.

Vielen Dank für Ihre Hilfe.

+0

'USE' zum Festlegen des DB-Kontexts wird von ADODB als geschlossenes Recordset angesehen, sodass Sie' Set rsdb = rsdb.NextRecordset' aufgerufen haben, um zum nächsten Recordset-Objekt zu wechseln, das Ihr Abfrageergebnis wäre. – Lankymart