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

标签 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;

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

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

谢谢!

最佳答案

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

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

关于sql-server - TADOStoredProc 返回记录集或输出参数的值(不是两者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14357437/

相关文章:

sql - 基于两列选择一行,一列包含 ID,另一列包含列中的特定值

c# - 使用 like 执行查询不起作用

android - Android 上 Delphi Firemonkey 中的模态弹出窗口

mysql - DBAdvGrid 显示小数

sql - 使用日期作为 SQL 过滤器

asp.net - 从ASP.NET访问 "user instance"数据库时用户权限错误

sql-server - 直接使用 PowerShell 与 SQL Agent PowerShell 作业步骤

sql-server - 为什么主键顺序很重要?

TSQL 消息 1013 "Use correlation names to distinguish them."

xml - 无法使用 Delphi 中的 XML 绑定(bind)解析 XML 文本中的值