惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
雷峰网
雷峰网
量子位
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
T
Tailwind CSS Blog
月光博客
月光博客
博客园 - 【当耐特】
博客园_首页
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
IT之家
IT之家
爱范儿
爱范儿
阮一峰的网络日志
阮一峰的网络日志
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
The Cloudflare Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
人人都是产品经理
人人都是产品经理
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - xalion

Delphi 13.1 内置支持 SSE (Server-Sent Events) Ubuntu 上 安装 sql server 2022 delphi 12.2 配置Linux 开发环境 Embarcadero 发布开源Bloodshed Dev C++ 分支 实战Devexpress FMX Grid 在ubuntu 上使用wine 运行Delphi win32 应用 苹果体 Delphi 10.4 新功能介绍 初识ubuntu上的docker PostgreSQL 基本数据类型及常用SQL 函数操作 一步一步从PostgreSQL安装到delphi 访问 DLL Injection with Delphi(转载) 使用FMXlinux 开发linux 桌面应用 推荐一套免费跨平台的delphi 哈希及加密算法库 提高sqlite 的运行性能(转载) 使用unidac 连接FB 3.0 (含嵌入版) 在datasnap 中使用unidac 访问数据(客户端) 在datasnap 中使用unidac 访问数据(服务器端) More x64 assembler fun-facts–new assembler directives(转载) x64 assembler fun-facts(转载)
如何在unidac 中执行一次查询获得多个数据集?
xalion · 2020-03-05 · via 博客园 - xalion

很多朋友问如何在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;

运行结果为:

 

 

 说明一切运行正常。