Asp SQLServer führt die gespeicherte Prozedur aus, um die vorübergehende Lösung zurückzugeben, dass der Vorgang nicht zulässig ist, wenn das Datensatzobjekt geschlossen wird. Wenn Sie einen besseren Weg haben, sagen Sie es mir bitte. Wenn Sie den Rückgabewert erhalten möchten, müssen Sie die Command-Methode verwenden.
Zunächst einmal gibt es zwei Arten von Rückgabewerten. Eine besteht darin, einen Wert direkt in der gespeicherten Prozedur zurückzugeben, genau wie der Funktionsrückgabewert von C und VB. Die andere besteht darin, mehrere Werte zurückzugeben, und die Variablennamen zum Speichern dieser Werte müssen zuerst in den aufrufenden Parametern angegeben werden .
Dieses Beispiel muss mehrere Parameter, Eingabeparameter, Ausgabeparameter, Rückgabedatensätze und einen direkten Rückgabewert verarbeiten (ist es vollständig genug?)
Die gespeicherte Prozedur lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
Kneipen nutzen
GEHEN
– Erstellen Sie eine gespeicherte Prozedur
Erstellen Sie die Prozedur sp_PubsTest
--Definieren Sie drei Parametervariablen. Beachten Sie, dass die dritte speziell für die Ausgabe markiert ist.
@au_lname varchar (20),
@intID int,
@intIDOut int AUSGABE
ALS
SELECT @intIDOut = @intID + 1
WÄHLEN *
VON Autoren
WHERE au_lname LIKE @au_lname + ''%''
--Einen Wert direkt zurückgeben
RETURN @intID + 2
Das ASP-Programm, das diese gespeicherte Prozedur aufruft, lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
<%@ Language=VBScript %>
<%
CmdSP dimmen
DimadoRS
Dimmen Sie adCmdSPStoredProc
Dimmen Sie adParamReturnValue
AdParamin-Eingabe dimmen
Dimmen Sie adParamOutput
AdInteger dimmen
iVal dimmen
Schwaches Oval
Schwaches adoField
AdVarChar dimmen
„Diese Werte sind in VB vordefinierte Konstanten und können direkt aufgerufen werden, sie sind in VBScript jedoch nicht vordefiniert.“
adCmdSPStoredProc = 4
adParamReturnValue = 4
adParaminput = 1
adParamOutput = 2
adInteger = 3
adVarChar = 200
iVal = 5
oVal = 3
''Erstellen Sie ein Befehlsobjekt
set CmdSP = Server.CreateObject(ADODB.Command)
''Verknüpfung erstellen
CmdSP.ActiveConnection = Driver={SQL Server};server=(local);Uid=sa;Pwd=;Database=Pubs
''Definieren Sie den Namen des Befehlsobjektaufrufs
CmdSP.CommandText = sp_PubsTest
''Legen Sie den Befehlsaufruftyp auf eine gespeicherte Prozedur fest (adCmdSPStoredProc = 4)
CmdSP.CommandType = adCmdSPStoredProc
''Parameter zum Befehlsobjekt hinzufügen
„Definieren Sie die gespeicherte Prozedur so, dass sie einen direkten Rückgabewert hat. Der Standardwert ist 4.“
CmdSP.Parameters.Append CmdSP.CreateParameter(RETURN_VALUE, adInteger, adParamReturnValue, 4)
''Definieren Sie einen Zeicheneingabeparameter
CmdSP.Parameters.Append CmdSP.CreateParameter(@au_lname, adVarChar, adParaminput, 20, M)
''Definieren Sie einen ganzzahligen Eingabeparameter
CmdSP.Parameters.Append CmdSP.CreateParameter(@intID, adInteger, adParamInput, , iVal)
''Definieren Sie einen ganzzahligen Ausgabeparameter
CmdSP.Parameters.Append CmdSP.CreateParameter(@intIDOut, adInteger, adParamOutput, oVal)
''Führen Sie die gespeicherte Prozedur aus und rufen Sie das zurückgegebene Recordset ab
Legen Sie adoRS = CmdSP.Execute fest
''Jeden Datensatz ausdrucken. Die Felder sind virtuell und können ignoriert werden.
Während nicht adoRS.EOF
für jedes adoField in adoRS.Fields
Response.Write adoField.Name & = & adoField.Value & <br> & vbCRLF
Nächste
Response.Write<br>
adoRS.MoveNext
Wend
''Drucken Sie zwei Ausgabewerte:
Response.Write <p>@intIDOut = & CmdSP.Parameters(@intIDOut).Value & </p>
Response.Write <p>Rückgabewert = & CmdSP.Parameters(RETURN_VALUE).Value & </p>
''Reinigung
Setze adoRS = nichts
Setzen Sie CmdSP.ActiveConnection = nichts
Setzen Sie CmdSP = nichts
%>
Wenn ich asp verwende, um die gespeicherte Prozedur aufzurufen und den Datensatz zurückzugeben, wird immer wieder der Fehler gemeldet, dass der Vorgang nicht zulässig ist, wenn das Objekt geschlossen ist. Ich habe viele Fragen durchsucht, konnte aber nicht die richtige Lösung finden ein Stück zuverlässigerer Code.
Schließlich stellte ich fest, dass das Problem in der gespeicherten Prozedur auftrat. Bei der gespeicherten Prozedur im Beispiel gab es kein Problem, aber als ich meine eigene gespeicherte Prozedur verwendete, trat ein Fehler auf.
Die endgültige Lösung besteht darin, es in die von mir verwendete gespeicherte Prozedur einzufügen
Fügen Sie vor jeder Insert-Anweisung einen Satz nocount für den Satz hinzu, d. h. fügen Sie einen Satz innerhalb der Cursorschleife hinzu.
Ich bin noch nicht näher auf die genauen Gründe eingegangen. Jeder, der es weiß, kann es nennen. Vielen Dank.