很多朋友问如何在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;
运行结果为:
说明一切运行正常。