unit Unit4;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, DBGridEhGrouping, ToolCtrlsEh,
DBGridEhToolCtrls, DynVarsEh, Vcl.StdCtrls, EhLibVCL, GridsEh, DBAxisGridsEh,
DBGridEh, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error,
FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool,
FireDAC.Stan.Async, FireDAC.Phys, FireDAC.VCLUI.Wait, Data.DB,
FireDAC.Comp.Client, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf,
FireDAC.DApt, FireDAC.Phys.MSSQLDef, FireDAC.Phys.ODBCBase,
FireDAC.Phys.MSSQL, FireDAC.Comp.UI, FireDAC.Comp.DataSet; type
TForm4 = class(TForm)
DBGridEh1: TDBGridEh;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
FDConnection1: TFDConnection;
FDGUIxWaitCursor1: TFDGUIxWaitCursor;
FDPhysMSSQLDriverLink1: TFDPhysMSSQLDriverLink;
DataSource1: TDataSource;
FDQuery1: TFDQuery;
Button5: TButton;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Button6: TButton;
Label2: TLabel;
Label1: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form4: TForm4; implementation {$R *.dfm} procedure TForm4.Button1Click(Sender: TObject);
var
start: Cardinal;
begin
start := GetTickCount;
FDQuery1.Close;
FDQuery1.FetchOptions.Mode := fmOnDemand;
FDQuery1.FetchOptions.RecordCountMode := cmVisible;
FDQuery1.Open('SELECT * FROM top_trade');
Label1.Caption := Format('总数:%d,耗时:%d',[FDQuery1.RecordCount, GetTickCount - start]);
end; procedure TForm4.Button2Click(Sender: TObject);
var
start: Cardinal;
begin
start := GetTickCount;
FDQuery1.Close;
FDQuery1.FetchOptions.Mode := fmAll;
FDQuery1.FetchOptions.RecordCountMode := cmVisible;
FDQuery1.Open('SELECT * FROM top_trade');
Label3.Caption := Format('总数:%d,耗时:%d',[FDQuery1.RecordCount, GetTickCount - start]);
end; /// <summary>
/// 方法1,重新根据官方的Mode参数设置,获取全部数据,重新查一次
/// </summary>
procedure TForm4.Button3Click(Sender: TObject);
var
start: Cardinal;
begin
start := GetTickCount;
with TFDQuery.Create(nil) do
begin
Connection := FDConnection1;
FetchOptions.Mode := fmAll;
Open(FDQuery1.SQL.Text);
Label4.Caption := Format('总数:%d,耗时:%d',[RecordCount, GetTickCount - start]);
Free;
end;
end; /// <summary>
/// 方法2,依然是重新查一次,但是不获取全部数据,保持官方的默认参数,
/// 开启数据集单向 然后 调用last方法 跳到最后 然后取RecordNo
/// </summary>
procedure TForm4.Button4Click(Sender: TObject);
var
start: Cardinal;
begin
start := GetTickCount;
with TFDQuery.Create(nil) do
begin
Connection := FDConnection1;
FetchOptions.CursorKind := ckForwardOnly;{开启单向}
Open(FDQuery1.SQL.Text);
Last;
Label5.Caption := Format('总数:%d,耗时:%d',[RecNo, GetTickCount - start]);
Free;
end;
end; /// <summary>
/// 方法3,测试 RecordCountMode
/// 经过测试这个 依然是查的全部 与 FetchOptions.Mode := fmAll 一样,但如果仅仅获取总数要快很多。
/// </summary>
procedure TForm4.Button5Click(Sender: TObject);
var
start: Cardinal;
begin
start := GetTickCount;
with TFDQuery.Create(nil) do
begin
Connection := FDConnection1;
FetchOptions.RecordCountMode := cmTotal;
Open(FDQuery1.SQL.Text);
Label6.Caption := Format('总数:%d,耗时:%d',[RecordCount, GetTickCount - start]);
Free;
end;
end; procedure TForm4.Button6Click(Sender: TObject);
var
start: Cardinal;
begin
start := GetTickCount;
FDQuery1.Close;
FDQuery1.FetchOptions.Mode := fmOnDemand;
FDQuery1.FetchOptions.RecordCountMode := cmTotal;
FDQuery1.Open('SELECT * FROM top_trade');
Label2.Caption := Format('总数:%d,耗时:%d',[FDQuery1.RecordCount, GetTickCount - start]);
end; end.

DEMO 下载链接: http://files.cnblogs.com/files/del88/FireDac-DEMO.zip

事实证明,即保证速度 又保证 recordCount是总数的情况下,通过 FDQuery1.FetchOptions.RecordCountMode := cmTotal; 这行代码是最 快的

要想保证RecordCount是总数的情况下,且加载全部数据的情况下,测试结果:

FetchOptions.Mode := fmAll; ---- 耗时5秒

RecordCountMode := cmTotal; ----- 耗时2秒。

这两句都能显示全部数据。

FireDac 的RecordCount 相关测试 记录。的更多相关文章

  1. 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

  2. Sybase 常用SQL

    http://blog.chinaunix.net/uid-200142-id-3073894.html ===========================使用总结================ ...

  3. MVC中实现加载更多

    需要实现的功能: 数据太多想初次加载部分数据,在底部加上“加载更多”按钮 点击后加载第二页数据(从数据库只取指定页数据)后接在已有数据后面(类似于android中的下拉加载更多) 每次加载时显示“正在 ...

  4. BIEE 10g 二次开发整理

    近半年在公司做某个项目的时候,主要使用到了Oracle BIEE 10g这套工具.刚开始的时候,对OBIEE是七窍通了六窍,还是一窍不通. 现在已经摸索出些许门道,特整理出来:一来,备忘:二来,供大家 ...

  5. cPage分页详细介绍

    asp.net中各种数据控件,datalist.gridview.Repeater等分页是最常用的功能,几乎任何一个B/S项目,无论是系统还是网站都会用到.分页时,读取整个数据,直接绑定到控件,都可以 ...

  6. SQL Server 常用命令使用方法

    (1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * f ...

  7. JAVA爬虫挖取CSDN博客文章

    开门见山,看看这个教程的主要任务,就去csdn博客,挖取技术文章,我以<第一行代码–安卓>的作者为例,将他在csdn发表的额博客信息都挖取出来.因为郭神是我在大学期间比较崇拜的对象之一.他 ...

  8. EF下泛型分页方法,更新方法

    /// <summary> /// 获取分页的分页集合 /// </summary> /// <typeparam name="S">实体类型& ...

  9. SSH2 框架下的分页

    1.设计分页实体(pageBean) 这里我显示的是3-12页的方式: package cn.itcast.oa.domain; import java.util.List; /** * 封装分页信息 ...

随机推荐

  1. PHP PDO的错误处理模式

    PDO默认的错误处理方式是返回一个数组格式的错误代码.如果想要判断SQL有没有出错时,就需要写一组代码来检测这个返回的数组.觉得这样有些麻烦.还好PDO还提供了另外两种处理方式,只要根据需要设置一下就 ...

  2. Spring以及SPringmvc相关问题: ServletContext -父子容器

    总结如下: 明确了Servlet规范中ServletContext的作用和意义.此外明确一个Tomcat中多个web应用,每个人web应用有唯一的一个ServletContext(全局上下文).[例子 ...

  3. ESXi查询网卡的驱动和固件版本

    ~ # esxcfg-nics -lName PCI Driver Link Speed Duplex MAC Address MTU Description vmnic0 0000:01:00.00 ...

  4. smarty模板引擎部分内容(思维导图)

  5. caffe.exe (caffe.bin)用法回顾

    caffe.bin :command line brew usage : caffe  <command><args> commands: train:  训练或者微调一个网络 ...

  6. email

    #region 邮件帮助类 //+-------------------------------------------------------------------+ //+ FileName: ...

  7. 我用VS2012在Nuget中安装Signalr之后报错

    我用VS2012在Nuget中安装Signalr之后报错 “/”应用程序中的服务器错误. The following errors occurred while attempting to load ...

  8. 实用的Portraiture滤镜磨皮教程

    滤镜可以快速地进行人物皮肤美化处理,Portraiture滤镜可以将皮肤柔化,消除多余的斑点,在磨皮后复制细节保留较多的通道到图层面板,用高反差保留滤镜提取细节,再更改图层混合模式即可以得到漂亮的肤色 ...

  9. IOS 设置导航栏全局样式

    // 1.设置导航栏背景 UINavigationBar *bar = [UINavigationBar appearance]; [bar setBackgroundImage:[UIImage r ...

  10. c++学习--面向对象一

    类与对象一 一 注意的点 1 利用构造函数给数据成员初始化的两种办法:1 赋值语句,2 用成员初始化列表 解释:1 成员初始化列表的一般形式为: 数据成员名1(初始值1),数据成员名2(初始值2) 2 ...