2017-02-06 27 views
2

Я хочу получить как код возврата, так и результат, полученный из хранимой процедуры в классическом ASP.Возвращает значение и набор результатов из хранимой процедуры classic 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 

Есть ли способ получить оба?

+0

Возвращаемое значение предназначено для возврата кода состояния выполнения, а не для возврата значений. Если вы хотите получать значения из процедуры, вы должны использовать параметры OUTPUT. –

+0

@SeanLange они используют его для возврата статуса выполнения, 2 без записей и 1 для некоторых. – Lankymart

+0

@ Lankymart Я буду вежливо не согласен. Это не возвращает статус выполнения, он возвращает логическое значение. Это отличный пример того, когда мы должны использовать выходной параметр. –

ответ

2

Вы уже делаете это, просто объедините два.

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 
+0

Извините, я всегда получаю vartype из 0 (vbEmpty - указывает Empty (неинициализированный)) –

+1

@DavidElliott это потому, что объект 'Recordset' должен быть закрыт, прежде чем вы сможете прочитать любые значения« OUTPUT »или« RETURN ». См. [Свойство значения (ADO)] (https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/value-property-ado), в частности поле Note - * «Если команда содержит Параметр, значение свойства которого пуст, и вы создаете набор записей из этой команды, убедитесь, что вы сначала закрываете набор записей, прежде чем извлекать свойство Value. "* – Lankymart

+2

:) Теперь отредактированная версия имеет смысл. Спасибо –