ich benutze eine umfangreichere StoredProcedure zum Suchen von Daten
in verschiedenen Tabellen. Grundaufbau der SP ist folgender
CREATE Procedure stProc_Suchen @strtblName nvarchar(20),
@strKriterium1 nvarchar(50) = Null, @strKriterium2 nvarchar(50) =
Null, ...<weitere Parameter>
<Prozedurtext> ...
In VB (VB6) rufe ich wie folgt auf:
Public rsSuchErgebnis As New ADODB.Recordset
Public cmdSuche As New ADODB.Command
...
<Datenbankverbindung herstellen>
With cmdSuche
.ActiveConnection = cnDBConn
.CommandType = adCmdStoredProc
.CommandText = "stProc_Suchen"
.Parameters.Append .CreateParameter("@strtblName", adVarChar,
adParamInput, 20, strTblName)
.Parameters.Append .CreateParameter("@strKriterium1",
adVarChar, adParamInput, 50, NZ(strKriterium1, Null))
.Parameters.Append .CreateParameter("@strKriterium2",
adVarChar, adParamInput, 50, NZ(strKriterium2, Null))
... <weitere Parameter>
Set rsSuchergebnis = .Execute
End With
If rsSuchergebnis.RecordCount > 0 Then <------ Hier kommt der Fehler
machwas
End if
Es kommt der Fehler 3704 (Der Vorgang ist für ein geschlossenes
Recordset nicht zugelassen). Probehalber habe ich mir aus der SP mit
einem Ausgabeparameter die Zahl der gefundenen Datensätze zurückgeben
lassen - es kommt immer die Anzahl der Datensätze, die ich auch
erhalte, wenn ich die SP mit entsprechenden Eingabeparametern im SQL-
Server starte.
Woran kann es liegen? Andere Command/Recordset -Kombinationen in der
gleichen Struktur funktionieren merkwürdigerweise in der Anwendung.
Schon mal danke im Voraus
Gruß
Karl
...
<Datenbankverbindung herstellen>
Es kommt der Fehler 3704 (Der Vorgang ist für ein geschlossenes Objekt
nicht zugelassen). Probehalber habe ich mir aus der SP mit einem
Ausgabeparameter die Zahl der gefundenen Datensätze zurückgeben lassen
- es kommt immer die Anzahl der Datensätze, die ich auch erhalte, wenn
ich die SP mit entsprechenden Eingabeparametern im SQL-Server starte.
Implizite Erzeugung eine neuen Connection-Objektes ist keine gute Idee.
Besser wäre es den Verweis auf ein Connection-Objekt zuzuweisen.
> .CommandType = adCmdStoredProc
> .CommandText = "stProc_Suchen"
> .Parameters.Append .CreateParameter("@strtblName", adVarChar,
> adParamInput, 20, strTblName)
> .Parameters.Append .CreateParameter("@strKriterium1",
> adVarChar, adParamInput, 50, NZ(strKriterium1, Null))
> .Parameters.Append .CreateParameter("@strKriterium2",
> adVarChar, adParamInput, 50, NZ(strKriterium2, Null))
> ... <weitere Parameter>
>
> Set rsSuchergebnis = .Execute
> End With
> If rsSuchergebnis.RecordCount > 0 Then <------ Hier kommt der Fehler
> machwas
> End if
>
> Es kommt der Fehler 3704 (Der Vorgang ist für ein geschlossenes
> Recordset nicht zugelassen).
Und wo ist die Open-Anweisung für das implizit erzeugte Objekt?
> Probehalber habe ich mir aus der SP mit
> einem Ausgabeparameter die Zahl der gefundenen Datensätze zurückgeben
> lassen - es kommt immer die Anzahl der Datensätze, die ich auch
> erhalte, wenn ich die SP mit entsprechenden Eingabeparametern im SQL-
> Server starte.
>
> Woran kann es liegen? Andere Command/Recordset -Kombinationen in der
> gleichen Struktur funktionieren merkwürdigerweise in der Anwendung.
Das glaube ich dir nicht. Eine EWxecute kann mit einer geschlossenen
Verbindung nicht funktionieren.
Du erhöhst Deine Chance, dass Deine Frage überhaupt gelesen und qualifiziert
und schnell beantwortet wird, wenn Du Deinen Realnamen im Absender
einstellst (Vor- und Zuname).
--
Viele Grüße
Peter
Pribier es mal richtig mit Set:
Set .ActiveConnection = cnDBConn
ok. Hoffe, es passt jetzt ....
das Problem lag dann doch auf der Prozedurseite: SET NOCOUNT ON war
das Zauberwort.
Ansonsten:
Hinter dem Kürzel <Datenbankverbindung herstellen> (siehe OP)
versteckt sich hier wie überall eine Abfrage, ob eine
Datenbankverbindung offen ist. Wenn ja, wird diese benutzt, wenn nein,
wir sie neu erzeugt. Ich wollte nur nicht alles wiederholen.
Gruß
Karl + Fuchs