Asp sqlserver выполняет хранимую процедуру, чтобы вернуть временное решение о том, что операция не разрешена, когда объект набора записей закрыт. Если у вас есть лучший способ, пожалуйста, скажите мне.
Если вы хотите получить возвращаемое значение, вам нужно использовать метод Command.
Прежде всего, существует два типа возвращаемых значений. Один из них — напрямую возвращать значение в хранимой процедуре, точно так же, как возвращаемое значение функции C и VB; другой — возвращать несколько значений, причем имена переменных для хранения этих значений необходимо сначала указать в вызывающих параметрах; .
В этом примере необходимо обрабатывать несколько параметров, входные параметры, выходные параметры, возвращаемые наборы записей и прямое возвращаемое значение (достаточно ли он завершен?)
Хранимая процедура выглядит следующим образом:
Скопируйте код кода следующим образом:
использовать пабы
ИДТИ
-- Создаем хранимую процедуру
создать процедуру sp_PubsTest
--Определите три переменных параметра. Обратите внимание, что третья специально помечена для вывода.
@au_lname varchar (20),
@intID целое число,
@intIDOut int ВЫХОД
КАК
ВЫБЕРИТЕ @intIDOut = @intID + 1
ВЫБИРАТЬ *
ОТ авторов
ГДЕ au_lname НРАВИТСЯ @au_lname + ''%''
--Возвращаем значение напрямую
ВОЗВРАТ @intID + 2
Программа asp, вызывающая эту хранимую процедуру, выглядит следующим образом:
Скопируйте код кода следующим образом:
<%@ Language=VBScript %>
<%
Тусклый CmdSP
ДимадоРС
Тусклый адкмдСПсторедпрок
Тусклый параметр объявленияParamReturnValue
Тусклый рекламный параметр
Dim adParamOutput
Тусклое объявлениеЦелое число
Дим иВал
Тусклый овал
Тусклое поле шума
Тусклый адВарЧар
'Эти значения являются предопределенными константами в VB и могут вызываться напрямую, но они не определены заранее в VBScript.
адкмдСПсторедпрок = 4
адПарамReturnValue = 4
адПараминпут = 1
адПарамВыход = 2
адЦелое = 3
адварчар = 200
iВал = 5
оВал = 3
''Создание командного объекта
установите CmdSP = Server.CreateObject("ADODB.Command")
''Создать ссылку
CmdSP.ActiveConnection = "Driver={SQL Server};server=(local);Uid=sa;Pwd=;Database=Pubs"
''Определить имя вызова объекта команды
CmdSP.CommandText = "sp_PubsTest"
''Установите тип вызова команды как хранимую процедуру (adCmdSPStoredProc = 4)
CmdSP.CommandType = adCmdSPStoredProc
''Добавление параметров в объект команды
''Определите хранимую процедуру, чтобы она имела прямое возвращаемое значение, и это целое число. Значение по умолчанию - 4.
CmdSP.Parameters.Append CmdSP.CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue, 4)
''Определить параметр ввода символов
CmdSP.Parameters.Append CmdSP.CreateParameter("@au_lname", adVarChar, adParaminput, 20, "M")
''Определить целочисленный входной параметр
CmdSP.Parameters.Append CmdSP.CreateParameter("@intID", adInteger, adParamInput, , iVal)
''Определить целочисленный выходной параметр
CmdSP.Parameters.Append CmdSP.CreateParameter("@intIDOut", adInteger, adParamOutput, oVal)
''Запустите хранимую процедуру и получите возвращенный набор записей
Установите adoRS = CmdSP.Execute
''Распечатайте каждую запись. Поля виртуальные и их можно игнорировать.
Пока не люблюRS.EOF
для каждого adoField в adoRS.Fields
Response.Запишите adoField.Name & "=" & adoField.Value & "<br>" & vbCRLF
Следующий
Ответ. Напишите "<br>"
адоRS.MoveNext
Венд
''Выведите два выходных значения:
Response.Write "<p>@intIDOut = " & CmdSP.Parameters("@intIDOut").Value & "</p>"
Response.Write "<p>Возвращаемое значение = " & CmdSP.Parameters("RETURN_VALUE").Value & "</p>"
''Уборка
Установите adoRS = ничего
Установите CmdSP.ActiveConnection = ничего
Установить CmdSP = ничего
%>
При использовании asp для вызова хранимой процедуры и возврата набора записей продолжает сообщать об ошибке «Операция не разрешена при закрытии объекта». Я искал много вопросов, но не нашел правильного решения. более надежного кода.
Наконец, я обнаружил, что проблема возникла в хранимой процедуре. В этом примере проблем с хранимой процедурой не было, но когда я использовал свою собственную хранимую процедуру, произошла ошибка.
Окончательное решение — поместить его в хранимую процедуру, которую я использую.
Перед каждым оператором Insert добавьте set nocount для предложения, то есть добавьте предложение внутри цикла курсора.
Я еще не вникал в конкретные причины. Кто знает, может указать на это. Спасибо.