ADODB-recordset öffnen schlägt fehl / "Operation ist nicht zulässig, wenn Objekt geschlossen"
Habe ich folgende UDF in excel, die ADO verwendet, um eine Verbindung zu meiner MSSQL-server. Es sollte führen Sie die Skalare udf "D100601RVDATABearingAllow".
Aus irgendeinem Grund der Parameter, die ich versuche anzuhängen sind nicht senden, um den sql server. Nur auf dem server:
SELECT dbo.D100601RVDATABearingAllow
kommt.
MEINE EXCEL UDF:
Function RVDATA(Fastener) As Long
Dim cnt As ADODB.Connection
Dim rst As ADODB.Recordset
Dim Cmd1 As ADODB.Command
Dim stSQL As String
Const stADO As String = "Provider=SQLOLEDB.1;Data ................"
'----------------------------------------------------------
Set cnt = New ADODB.Connection
With cnt
.ConnectionTimeout = 3
.CursorLocation = adUseClient
.Open stADO
.CommandTimeout = 3
End With
'----------------------------------------------------------
Set Cmd1 = New ADODB.Command
Cmd1.ActiveConnection = cnt
Cmd1.CommandText = "dbo.D100601RVDATABearingAllow"
Cmd1.CommandType = adCmdStoredProc
'----------------------------------------------------------
Set Param1 = Cmd1.CreateParameter("Fastener", adInteger, adParamInput, 5)
Param1.Value = Fastener
Cmd1.Parameters.Append Param1
Set Param1 = Nothing
'----------------------------------------------------------
Set rst = Cmd1.Execute()
RVDATA = rst.Fields(0).Value
'----------------------------------------------------------
rst.Close
cnt.Close
Set rst = Nothing
Set cnt = Nothing
'----------------------------------------------------------
End Function
Wenn ich adCmdStoredProc die ganze Sache nicht und in der vba-debugger die Eigenschaften des recordset hat eine Menge "Operation ist nicht zulässig, wenn Objekt geschlossen ist" (klingt ein wenig anders, die Nachricht übersetzt)
Wenn ich nicht verwenden, adCmdStoredProc bekomme ich die Meldung, dass die variable - Verschluss war nicht vorgesehen.
Ich denke, dass vielleicht etwas falsch in der Art, wie ich das recordset öffnen.
In anderen treads habe ich gelesen, mit der "SET NOCOUNT ON" - option, aber das hat nicht funktioniert entweder.
Hat jemand eine Idee?
Grüße Lumpi
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lief in dieser Fehler als auch (in meinem Fall bin ich mit einer Gespeicherten Prozedur zum abrufen einige Informationen). Ich hatte einige änderungen vorgenommen, durch die die Ausführung stören.
Verschwand die Fehlermeldung, wenn ich SET NOCOUNT ON als die erste Anweisung der Gespeicherten Prozedur.
Brauchen Sie nicht zu
SELECT
der server-Seite-Funktion, geben Sie einfach seinen Namen ("[tra-CAE400-1].dbo.D100601RVDATABearingAllow") in der.CommandText
Eigenschaft.Auch Sie sollten die
.CommandType
- Eigenschaft auf "stored-procedure" (Referenz auf w3schools.com).Dann adodb wissen, dass Sie reden über eine Funktion aufrufen, und nicht versuchen, das senden einer einfachen sql-Befehl.
Chancen sind, dass es Ihnen dann erlauben, Parameter zu definieren, auf das command-Objekt.
Aber die Parameter, die Sie definieren, auf das command-Objekt sollte exakt übereinstimmen (name und Typ) für diejenigen, die definiert sind als die Argumente der Funktion in den sql-server.
Ein Beispiel aus microsoft.com über die Verwendung der Kommando-Objekt mit einer gespeicherten Prozedur
ADO-Verweis auf microsoft.com
Andere mögliche Ursache ist eine debug-Anweisungen. Ich verbrachte viel zu lange versucht, herauszufinden, warum würde dies nicht funktionieren, für mich, der Proc auf die Datenbank funktioniert, die Daten einfügen sollen eingefügt wurde, wird der VBA-code funktioniert, aber es war nichts im recordset.
Endgültige Lösung war, um durch die procs, die gebaut worden waren, und entfernen Sie die PRINT-Anweisungen.
Um zu testen, ob dies das problem ist, führen Sie den proc auf dem SQL-Server manuell suchen, dann schauen Sie auf die Nachrichten-Registerkarte Ergebnisse, wenn es dort alles andere als " - Befehl(E) erfolgreich abgeschlossen." Sie brauchen, um zu beseitigen, die Nachrichten. "SET NOCOUNT ON" wird loszuwerden, die Zeilenanzahl Nachrichten, aber es könnte auch andere.
Ich gehe davon aus, dass nach 5 Jahren die OP hat gelöst diese problem haben, so ist dies nur für jemanden wie mich, der findet diese bei der Suche nach dem gleichen problem.
Ich lief auch in diese mit einer gespeicherten Prozedur. Haben Sie SET NOCOUNT = OFF; an der Unterseite des Codes? Das ist was für mich gearbeitet nach viel googeln. Auch, wenn Sie irgendwelche anderen code, der ausgeführt wird, müssen Sie wickeln Sie es in Nocount = on/off, EINSCHLIEßLICH der insert-und update-Anweisungen. Sie würden denken, dass eine insert-Anweisung wäre kein Problem, aber das einwickeln der code Weg ist, was mich davon abgehalten, Selbstmord zu Begehen heute.
In unserem shop verwenden wir oft Zeilen wie diese in unserer gespeicherten Prozeduren zur Unterstützung bei debugging:
Dieser bricht auch ein recordset öffnen, in Excel-vba. Ich glaube, die Antwort für diese Frage ist, die in der gespeicherten Prozedur: