#sql #sql-server #vb.net #asp-classic #adodb
#sql-server #vbscript #asp-classic #adodb
Вопрос:
Я хочу получить как код возврата, так и набор результатов из хранимой процедуры в классическом ASP.
CREATE PROCEDURE CheckEmployeeId
@EmployeeName nvarchar(255)
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@Exists INT
, @RowCount Int = 0
, @ReturnValue Int = 1
SELECT EmployeeId FROM Employees WHERE Name = @EmployeeName
set @RowCount = @@ROWCOUNT
if (@RowCount <> 1)
BEGIN
SET @ReturnValue = 2
END
ELSE
BEGIN
SET @ReturnValue = 1
END
RETURN @ReturnValue
END
Итак, в ASP я могу сделать следующее, чтобы получить возвращаемое значение
Set cmd = CreateObject("ADODB.Command")
with cmd
.ActiveConnection = cnnstr
.CommandType = adCmdStoredProc
.CommandText = "CheckEmployeeId"
.Parameters.Refresh
.Parameters("@EmployeeName") = EmployeeName
end with
cmd.Execute()
RetVal = cmd.Parameters("@RETURN_VALUE")
или это, чтобы получить результирующий набор.
Set cmd = CreateObject("ADODB.Command")
with cmd
.ActiveConnection = cnnstr
.CommandType = adCmdStoredProc
.CommandText = "CheckEmployeeId"
.Parameters.Refresh
.Parameters("@EmployeeName") = EmployeeName
Set rst = .Execute()
end with
Есть ли способ получить оба?
Комментарии:
1. Возвращаемое значение предназначено для возврата кода состояния выполнения, а не для возврата значений. Если вы хотите получить значения обратно из процедуры, вы должны использовать ВЫХОДНЫЕ параметры.
2. @SeanLange они используют его для возврата статуса выполнения, 2 для отсутствия записей и 1 для некоторых.
3. @Lankymart Я вежливо не соглашусь. Это не возвращает статус выполнения, это возвращает логическое значение. Это отличный пример того, когда мы должны использовать выходной параметр.
4. @SeanLange честно говоря, вы разделяете волосы, вы хотите быть педантичным в этом, это зависит от вас. Даже Microsoft не согласна — см. RETURN (Transact-SQL) — Пример B. Возвращаемые коды состояния.
5. @Lankymart Я, конечно, не воспринимал это как-то иначе. Как вы сказали, это в основном предпочтение.
Ответ №1:
Вы уже это делаете, просто объедините их.
Set cmd = CreateObject("ADODB.Command")
with cmd
.ActiveConnection = cnnstr
.CommandType = adCmdStoredProc
.CommandText = "CheckEmployeeId"
.Parameters.Refresh
.Parameters("@EmployeeName") = EmployeeName
Set rst = .Execute()
end with
'You will need to close the Recordset before returning the RETURN_VALUE.
RetVal = cmd.Parameters("@RETURN_VALUE")
Вам не нужно выбирать один или другой, они независимы друг от друга. Единственной проблемой будет порядок, в котором они возвращаются, помните, что оба OUTPUT
RETURN
значения и не будут доступны, пока не будут закрыты все возвращенные наборы записей.
Лично я предпочитаю сразу закрывать их, сохраняя их в виде 2-х мерных массивов.
Set cmd = CreateObject("ADODB.Command")
with cmd
.ActiveConnection = cnnstr
.CommandType = adCmdStoredProc
.CommandText = "CheckEmployeeId"
.Parameters.Refresh
.Parameters("@EmployeeName") = EmployeeName
Set rst = .Execute()
If Not rst.EOF Then data = rst.GetRows()
Call rst.Close()
end with
RetVal = cmd.Parameters("@RETURN_VALUE")
'Access Recordset array
If IsArray(data) Then
'Return first column, first row.
Response.Write data(0, 0)
End If
Комментарии:
1. Извините, я всегда получаю vartype 0 (vbEmpty — указывает на пустой (неинициализированный))
2. @DavidElliott это потому
Recordset
, что объект должен быть закрыт, прежде чем вы сможете прочитать какиеOUTPUT
-либоRETURN
значения или. См. раздел Свойство значения (ADO) , в частности, поле примечания — «Если команда содержит параметр, свойство значения которого пустое, и вы создаете набор записей из команды, убедитесь, что вы сначала закрыли набор записей перед извлечением свойства значения».