Asp sqlserver executa o procedimento armazenado para retornar a solução temporária de que a operação não é permitida quando o objeto do conjunto de registros é fechado. Se você tiver uma maneira melhor, por favor me diga.
Se quiser obter o valor de retorno, você precisa usar o método Command.
Em primeiro lugar, existem dois tipos de valores de retorno. Uma é retornar diretamente um valor no procedimento armazenado, assim como o valor de retorno da função de C e VB, a outra é retornar vários valores, e os nomes das variáveis para armazenar esses valores precisam ser especificados primeiro nos parâmetros de chamada; .
Este exemplo precisa lidar com vários parâmetros, parâmetros de entrada, parâmetros de saída, conjuntos de registros de retorno e um valor de retorno direto (está completo o suficiente?)
O procedimento armazenado é o seguinte:
Copie o código do código da seguinte forma:
usar bares
IR
-- Cria um procedimento armazenado
criar procedimento sp_PubsTest
--Define três variáveis de parâmetro. Observe que a terceira é especialmente marcada para saída.
@au_lname varchar (20),
@intID int,
@intIDOut int SAÍDA
COMO
SELECIONE @intIDOut = @intID + 1
SELECIONE *
DOS autores
ONDE au_lname LIKE @au_lname + ''%''
--Retorna um valor diretamente
RETURN @intID + 2
O programa asp que chama esse procedimento armazenado é o seguinte:
Copie o código do código da seguinte forma:
<%@Idioma=VBScript%>
<%
Dim CmdSP
Dimado RS
Dim adCmdSPStoredProc
Dim adParamReturnValue
Escurecer adParaminput
Escurecer adParamOutput
Dim adInteger
Dim iVal
Dim oVal
Dim adoField
Dim adVarChar
'Esses valores são constantes predefinidas em VB e podem ser chamadas diretamente, mas não são predefinidas em VBScript
adCmdSPStoredProc = 4
adParamReturnValue = 4
adParaminput = 1
adParamOutput = 2
anúncioInteiro = 3
adVarChar = 200
iVal = 5
oVal = 3
''Crie um objeto de comando
definir CmdSP = Server.CreateObject("ADODB.Command")
''Criar link
CmdSP.ActiveConnection = "Driver={SQL Server};servidor=(local);Uid=sa;Pwd=;banco de dados=Pubs"
''Defina o nome da chamada do objeto de comando
CmdSP.CommandText = "sp_PubsTest"
''Defina o tipo de chamada de comando como um procedimento armazenado (adCmdSPStoredProc = 4)
CmdSP.CommandType = adCmdSPStoredProc
''Adicionar parâmetros ao objeto de comando
''Defina o procedimento armazenado para ter um valor de retorno direto e é um número inteiro. O valor padrão é 4.
CmdSP.Parameters.Append CmdSP.CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue, 4)
''Definir um parâmetro de entrada de caracteres
CmdSP.Parameters.Append CmdSP.CreateParameter("@au_lname", adVarChar, adParaminput, 20, "M")
''Definir um parâmetro de entrada inteiro
CmdSP.Parameters.Append CmdSP.CreateParameter("@intID", adInteger, adParamInput, , iVal)
''Defina um parâmetro de saída inteiro
CmdSP.Parameters.Append CmdSP.CreateParameter("@intIDOut", adInteger, adParamOutput, oVal)
''Execute o procedimento armazenado e obtenha o conjunto de registros retornado
Definir adoRS = CmdSP.Execute
''Imprima cada registro. Os campos são virtuais e podem ser ignorados.
Embora não adoRS.EOF
para cada adoField em adoRS.Fields
Response.Write adoField.Name & "=" & adoField.Value & "<br>" & vbCRLF
Próximo
Resposta.Escreva "<br>"
adoRS.MoveNext
Wend
''Imprime dois valores de saída:
Response.Write "<p>@intIDOut = " & CmdSP.Parameters("@intIDOut").Value & "</p>"
Response.Write "<p>Valor de retorno = " & CmdSP.Parameters("RETURN_VALUE").Value & "</p>"
''Limpeza
Definir adoRS = nada
Definir CmdSP.ActiveConnection = nada
Definir CmdSP = nada
%>
Ao usar asp para chamar o procedimento armazenado e retornar o conjunto de registros, o erro "Operação não permitida quando o objeto é fechado" continua reportando. Procurei muitas dúvidas, mas não encontrei a solução certa. de código mais confiável.
Finalmente, descobri que o problema ocorreu no procedimento armazenado. Não houve problema com o procedimento armazenado no exemplo, mas quando usei meu próprio procedimento armazenado, ocorreu um erro.
A solução final é colocá-lo no procedimento armazenado que uso
Antes de cada instrução Insert, adicione um set nocount on sentença, ou seja, adicione uma frase dentro do loop do cursor.
Ainda não me aprofundei nos motivos específicos. Quem souber pode apontar.