4

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

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 参数的值。这是什么意思?

谢谢!

4

1 回答 1

5

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

Proc.Open;
while not Proc.Eof do
begin
  Proc.Next;
end;
Proc.Close;
Result := PResValue.Value;
于 2013-01-16T15:32:33.047 回答