posts - 254,  comments - 535,  trackbacks - 0

很多朋友问如何在unidac 中执行一次查询获得多个数据集?

其实这个问题很简单,unidac 很早就支持这个功能,但是很多人没有研究过。

今天就简单说一下,在unidac 中执行一次查询获得多个数据集。首先这个需要数据库支持,如果

数据库不支持的话,unidac 也是没有办法实现的。

今天以sql server 2014 为例,说一下如何实现这个功能。

首先我们在uniquery中执行下面的查询语句。

procedure TForm2.Button7Click(Sender: TObject);
begin
  cx.SQL.Clear;
  cx.SQL.Add('SELECT  *  FROM DWB d');
  cx.SQL.Add('SELECT * FROM FJRYB f');
  cx.Open;
end;

很明显,如果我们直接运行这一段代码,就会和正常的语句一样,返回第一个select 语句的结果

 

 

 那么我们怎么取得第二个数据集呢?很简单

procedure TForm2.Button8Click(Sender: TObject);
begin
 if not cx.OpenNext then
   exit;

end;

我们只需调用OpenNext 过程。如果有第二个数据集,当前的数据集就移动到第二个数据集了

 

 

 由于只有两个数据集,如果再次执行opennext 就关闭数据集了。什么也不显示了。

 

 

 那么再来一次,又可以显示第一个数据集了,说明这个opennext 是环形的。

当然了在存储过程中这个也是类似的。

我们首先写一个存储过程。

CREATE PROCEDURE dbo.MYSUM @sumok INT OUTPUT
AS
BEGIN

  SET @sumok = 1 + 2

  SELECT    *   FROM DWB d
    SELECT  *   FROM FJZB f
END
GO

我们要返回两个数据集,一个输出参数。

procedure TForm2.Button6Click(Sender: TObject);
var
  i:integer;

  tablelist:Tlist<Tdataset> ;
begin
   sp.Params[1].ParamType:=ptInputOutput;
   sp.Params[1].DataType:=ftInteger;
   sp.Params[1].AsInteger:=10;
   sp.Execute;
     repeat
       showmessage(  sp.Fields[1].AsString);
     until  not sp.OpenNext;


  i:=sp.Params[1].AsInteger;

  showmessage(i.ToString);
end;

运行结果为:

 

 

 

 

 

 说明一切运行正常。

 

posted on 2020-03-05 10:43  xalion  阅读(410)  评论(0编辑  收藏