【问题标题】:How get an SQL output cursor into a Delphi Data Component?如何将 SQL 输出游标放入 Delphi 数据组件?
【发布时间】:2015-03-10 16:19:56
【问题描述】:

我有一个带有这个签名的存储过程:

CREATE PROCEDURE SI_Inteligence(@dt datetime, @actions varchar(6), @FullData cursor varying out) 

这个过程返回一个打开的游标。

我需要什么样的组件来捕获它并逐条记录迭代它?它只是存储过程中的一个参数!

procedure DoIt;
var sp: TADOStoredProc;
    x: TADODataSet; //?
begin
  sp               := TADOStoredProc.Create(Self);
  sp.Connection    := myConnection; //TADOConnection Component
  sp.ProcedureName := 'SI_Inteligence';
  sp.Parameters.ParamByName('@dt').Value      := date;
  sp.Parameters.ParamByName('@actions').Value := 'something';
  sp.ExecProc;//? Open doesn't return anything
  x := TADODataSet.Create(Self);
  //How load the cursor??
  x.Assign(sp.Parameters.ParamByName('@FullData') as TADODataSet); //crash

end;

现在我需要循环那个光标。我该怎么做?

【问题讨论】:

  • 为什么返回游标中的数据而不是结果集?还有哪个版本的Delphi?
  • 使用 TADOQuery 和 EXEC 语句
  • 这只是一个例子。我真正的 sp 返回 4 个游标。我正在使用 Delphi XE 3

标签: sql-server delphi cursor varying


【解决方案1】:

CURSOR 参数作为记录集返回,因此您可以使用与 TDataSet 类相关的 TADOStoredProc 方法迭代数据,例如 EofNextFieldByName 等。

试试这个代码。

  ADOStoredProc1.ExecProc;
  while not ADOStoredProc1.Eof do
  begin
    //do something 
    //ADOStoredProc1.FieldByName('Foo').Value;    
    ADOStoredProc1.Next;
  end;

如果存储过程返回的不仅仅是一个游标,您可以使用NextRecordset 方法迭代记录集,如post 中所述。

【讨论】:

  • 将“SI_Inteligence” sp 分配给 AdoStoredProc1.ProcedureName 时,组件会填充所有参数。它将对应的光标创建为“整数”。如果更改为 ftCursor 或 ftDataSet,则会引发“参数不正确、超出范围或与其他冲突”消息......并且 ExecProc 不会运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多