TADOStoredProc返回记录集或输出参数值(不是两者)

时间:2013-01-16 11:33:09

标签: sql-server sql-server-2008 delphi delphi-7

我的存储过程接受一个输出参数并返回记录集。

CREATE PROCEDURE MyProc
    @EntityCode BIGINT, @ResValue INT OUTPUT
AS
BEGIN
  SELECT .... WHERE Code=@EntityCode
  SET @ResValue = ...
END

我需要同时接收输出参数和记录集的值。所以我这样做:

function GetData(const EntityCode: Int64): Integer;
var
  Proc: TADOStoredProc;
  PEntityCode: ADODB.TParameter;
  PResValue: ADODB.TParameter;
begin
  Proc := TADOStoredProc.Create(nil);
  try
    Proc.Connection := ADOConnection1;
    Proc.CursorLocation := clUseServer;
    Proc.ProcedureName := 'MyProc';

    PEntityCode := Proc.Parameters.AddParameter;
    PEntityCode.Name := '@EntityCode';
    PEntityCode.DataType := ftLargeint;
    PEntityCode.Value := EntityCode;

    PResValue := Proc.Parameters.AddParameter;
    PResValue.Name := '@ResValue';
    PResValue.DataType := ftInteger;
    PResValue.Direction := pdOutput;

    //Proc.Prepared := True;
    Proc.Open;
    Result := PResValue.Value;
    while not Proc.Eof do
    begin
      Proc.Next;
    end;
  finally
    Proc.Free;
  end;
end;

Recordset不为空,但PResValue.Value为0.如果我调用Proc.ExecProc,则记录集为空,但分配了PResValue.Value。是否可以同时接收记录集和输出参数值?

我发现如果MyProc的记录集只包含一条记录,则分配OUTPUT参数值。这是什么意思?

谢谢!

1 个答案:

答案 0 :(得分:5)

解决方案是在访问输出变量之前关闭记录集:

Proc.Open;
while not Proc.Eof do
begin
  Proc.Next;
end;
Proc.Close;
Result := PResValue.Value;