Asp sqlserver ejecuta el procedimiento almacenado para devolver la solución temporal de que la operación no está permitida cuando el objeto del conjunto de registros está cerrado. Si tienes una mejor manera, por favor dímelo.
Si desea obtener el valor de retorno, debe utilizar el método Comando.
En primer lugar, existen dos tipos de valores de retorno. Una es devolver directamente un valor en el procedimiento almacenado, al igual que el valor de retorno de la función de C y VB, la otra es devolver múltiples valores, y los nombres de las variables para almacenar estos valores deben especificarse primero en los parámetros de llamada; .
Este ejemplo necesita manejar múltiples parámetros, parámetros de entrada, parámetros de salida, conjuntos de registros de retorno y un valor de retorno directo (¿es lo suficientemente completo?)
El procedimiento almacenado es el siguiente:
Copie el código de código de la siguiente manera:
usar pubs
IR
-- Crear un procedimiento almacenado
crear procedimiento sp_PubsTest
--Defina tres variables de parámetros. Tenga en cuenta que la tercera está especialmente marcada para salida.
@au_lname varchar (20),
@intIDint,
@intIDOut int SALIDA
COMO
SELECCIONAR @intIDOut = @intID + 1
SELECCIONAR *
DE autores
DONDE au_lname ME GUSTA @au_lname + ''%''
--Devuelve un valor directamente
VOLVER @intID + 2
El programa asp que llama a este procedimiento almacenado es el siguiente:
Copie el código de código de la siguiente manera:
<%@ Idioma=VBScript %>
<%
Atenuar CmdSP
DimadoRS
Anuncio atenuadoCmdSPStoredProc
Dim adParamReturnValue
Anuncio oscuroParaminput
Dim adParamOutput
Anuncio atenuadoEntero
iVal tenue
óvalo tenue
Dim adoField
AdVarChar atenuado
'Estos valores son constantes predefinidas en VB y se pueden llamar directamente, pero no están predefinidos en VBScript
adCmdSPStoredProc = 4
adParamReturnValue = 4
anuncioParaminput = 1
salidaParamad = 2
anuncioEntero = 3
adVarChar = 200
iVal = 5
oVal = 3
''Crear un objeto de comando
establecer CmdSP = Server.CreateObject ("ADODB.Command")
''Crear enlace
CmdSP.ActiveConnection = "Controlador={SQL Server};servidor=(local);Uid=sa;Pwd=;Base de datos=Pubs"
''Definir el nombre de llamada del objeto de comando
CmdSP.CommandText = "sp_PubsTest"
''Establezca el tipo de llamada de comando para que sea un procedimiento almacenado (adCmdSPStoredProc = 4)
CmdSP.CommandType = adCmdSPStoredProc
''Agregar parámetros al objeto de comando
''Defina el procedimiento almacenado para que tenga un valor de retorno directo y sea un número entero. El valor predeterminado es 4.
CmdSP.Parameters.Append CmdSP.CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue, 4)
''Definir un parámetro de entrada de caracteres
CmdSP.Parameters.Append CmdSP.CreateParameter("@au_lname", adVarChar, adParaminput, 20, "M")
''Definir un parámetro de entrada de número entero
CmdSP.Parameters.Append CmdSP.CreateParameter("@intID", adInteger, adParamInput,, iVal)
''Definir un parámetro de salida entero
CmdSP.Parameters.Append CmdSP.CreateParameter("@intIDOut", adInteger, adParamOutput, oVal)
''Ejecute el procedimiento almacenado y obtenga el conjunto de registros devuelto
Establecer adoRS = CmdSP.Execute
''Imprime cada registro. Los campos son virtuales y pueden ignorarse.
Mientras no adoRS.EOF
para cada adoField en adoRS.Fields
Respuesta.Escribir adoField.Name & "=" & adoField.Value & "<br>" & vbCRLF
Próximo
Respuesta.Escribe "<br>"
adoRS.MoveNext
Encaminarse a
''Imprimir dos valores de salida:
Respuesta.Escribir "<p>@intIDOut = " & CmdSP.Parameters("@intIDOut").Valor & "</p>"
Response.Write "<p>Valor de retorno = " & CmdSP.Parameters("RETURN_VALUE").Valor & "</p>"
''Limpieza
Establecer adoRS = nada
Establecer CmdSP.ActiveConnection = nada
Establecer CmdSP = nada
%>
Cuando uso ASP para llamar al procedimiento almacenado y devolver el conjunto de registros, sigue apareciendo el error "Operación no permitida cuando el objeto está cerrado". Busqué muchas preguntas, pero no pude encontrar la solución correcta. de código más confiable.
Finalmente, descubrí que el problema ocurrió en el procedimiento almacenado. No hubo ningún problema con el procedimiento almacenado en el ejemplo, pero cuando usé mi propio procedimiento almacenado, ocurrió un error.
La solución final es ponerlo en el procedimiento almacenado que uso.
Antes de cada instrucción Insertar, agregue una oración establecida sin recuento, es decir, agregue una oración dentro del bucle del cursor.
Aún no he profundizado en las razones específicas. Cualquiera que sepa puede señalarlo.