delphi 新版内存表 FDMemTable
c++builder XE
官方demo最全60多个
http://community.embarcadero.com/blogs?view=entry&id=8761
FireDAC.Comp.Client
用好FDMemTable代替之前的ClientDataSet,以前ClientDataSet内存表转换太繁琐了步骤。
TClientDataSet *cds = new TClientDataSet(this);
DataSetProvider1->DataSet = dm->ADOQueryPub;
cds->ProviderName = "DataSetProvider1";
cds->Open();
一句就可以了
FDMemTable1->CopyDataSet(dm->ADOQueryPub, TFDCopyDataSetOptions() << coStructure << coRestart << coAppend);
多用FDMemTable,不再用ClientDataSet\DataSetProvider1做转换了
FDMemTable2->Data = FDMemTable1->Data;
FDMemTable2->CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() << coStructure << coRestart << coAppend);
建立缓存表
复制代码
FDMemTable1.Close();
FDMemTable1.FieldDefs.Clear();
FDMemTable1.FieldDefs.Add('ID', ftInteger, 0, True);
FDMemTable1.FieldDefs.Add('Name', ftString, 20, false);
FDMemTable1.CreateDataSet();
FDMemTable1.AppendRecord([101, 'aaa']);
FDMemTable1.AppendRecord([102, 'bbb']);
FDMemTable1.AppendRecord([103, 'ccc']);
复制代码
0)FDMemTable1.SourceView遍历各行数据,取任意行数据无需Next移动指针了。TFDDatSView
for (int i = 0; i < FDMemTable1->SourceView->Rows->Count; i++)
{
Caption = FDMemTable1->SourceView->Rows->ItemsI[i]->GetData(1);
}
FDMemTable1->SourceView->Rows->ItemsI[i]->GetData("fieldName");//取指定行指定字段名的值
}
9行7列的值。
FDMemTable1.Data.DataView.Rows.ItemsI[9].ValueI[7];
FDMemTable1.Table.Rows[i].ValueI[oCol.Index]
Caption = FDMemTable1->SourceView->Rows->Count;//过滤后1条
Caption = FDMemTable1->Table->Rows->Count;//过滤无效,全部记录3条
iMax := 0;
for i := 0 to FDQuery1.SourceView.Rows.Count - 1 do
if FDQuery1.SourceView.Rows[i].GetData('id', @iVal) and (iVal > iMax) then
iMax := iVal
数据集拷贝,复制数据集,合并数据集
FDMemTable1->Filter = "id=102";
FDMemTable1->Filtered = true;
FDMemTable1只有1条记录
1)Data
FDMemTable2->Data = FDMemTable1->Data;
FDQuery->Open("select * from tt");
FDMemTable2->Data = FDQuery->Data;
FDMemTable2是全部记录,有3条记录。
FDMemTable1->Delete();后的记录不在Data里。
2)CopyDataSet
带结构拷贝
FDMemTable2->CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() << coStructure << coRestart << coAppend);
FDMemTable2->CommitUpdates();
缓存更新用到changeCount,所以copy完后加上CommitUpdates
不带结构,仅拷贝数据,字段个数可以不一致,字段数以目标数据集FDMemTable2为标准。
FDMemTable2->CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() << coRestart << coAppend);
//第二个参数默认是coRestart << coAppend,所以下面就更简单了。
FDMemTable2->CopyDataSet(FDMemTable1);
FDMemTable2只有1条记录
3)CopyRecord\CopyField
copy the current record field values .Only One Record
FDMemTable2->CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() << coStructure);
FDMemTable2->Edit();
FDMemTable2->CopyRecord(FDMemTable1);
4)CloneCursor
All Record, ignore filter
CloneCursor,数据共享,一个修改,另一个也修改了,但是FDMemTable1->Close之后FDMemTable2还正常显示。
FDMemTable2->CloneCursor( FDMemTable1);
2016.3.4 test 不能排序,FDMemTable2->IndexFieldNames = "ID";不起作用,所以尽量不建议用这个方式。
5)AtrachTable
All Record,ignore filter,TFDDatSTable
FDMemTable2->AttachTable(FDMemTable1->Table, NULL);
//or
//FDMemTable2->AttachTable(FDMemTable1->Table,FDMemTable1->View);
FDMemTable2->Open();
6)FilteredData
FDQuery1.Filter := 'upper(name) like ''D%''';
FDQuery1.Filtered := True;
// copy to FDMemTable1 all FDQuery1 visible (where name starts from D) records
FDMemTable1.Data := FDQuery1.FilteredData;
RecordCount是过滤后的记录数。过滤前有100行,过滤后有5行,那么RecordCount就是5
7)XMLData
All Record ignore filter
Memo1->Text = FDMemTable1->XMLData;
FDMemTable2->XMLData = Memo1->Text;
FDMemTable1->ChangeCount,
通过Data赋值,默认全部记录都是修改过的,也就是ChangeCount=RecordCount,有100条记录,获取ChangeCount属性就是100.这样合适还是不合适呢?
FDMemTable1->Data = FDQuery->Data;
FDMemTable1->CancelUpdates();或者FDMemTable1->CommitUpdates();
加上CancelUpdates这句话,ChangeCount就正常了!!反应真实的修改记录数。
Append的记录需要把属性CachedUpdates设为true,ChangeCount就正确了。
8)Delta
IFDDataSetReference类型
FDMemTable2->Delta= FDMemTable1->Delta;
ADMemTable1.FilterChanges := [rtModified, rtInserted, rtDeleted];
ADMemTable1.Data := ADQuery1.Delta;
9)查看删除过的记录UpdateStatus
FDMemTable想要找到并显示删除的记录
FDMemTable1->Delete();
FDMemTable2->FilterChanges << Firedac::Comp::Dataset::rtDeleted;
FDMemTable1->Data = FDMemTable1->Data;
while (!FDMemTable1.eof)
{
if( table->UpdateStatus() == usDeleted)
...
}
默认是不显示删除过的记录的,FilterChanges不包括rtDeleted属性。
10)分页及加载全部页
FetchOptions的Mode默认是fmOnDemand表示分页,每页50,改为fmAll表示全部记录。
分页TFDFetchOptions.RowsetSize
FetchNext
FetchAll
FetchOptions.RecordCountMode property
FDQuery1.Open;
FDQuery1.FetchAll;//必须加这一句,否则数据集不全。
FDMemTable1.Data := FDQuery1.Data;
用了grideh,为何导致分页不灵了???全部记录出来了?field设置了ftsum导致,不设置每次就50行记录。
LocateEx
11)增强的Locate功能LocateEx、LookupEx函数
lxoCheckOnly If included, then LocateEx does not:
Change the current position. Fire BeforeScroll / AfterScroll events. Finish editing mode
不改变位置和编辑状态的搜索,强大!
12)刷新数据集
query1.Refresh();
13)只读字段
select '' as temp,flag=0,sql返回的虚拟字段,以前clientDataSet可以修改,FDMemTable里不能改了。
ClientDataSet1->FieldByName("flag")->AsString="1";
但是FDMemTable不能改了。怎么办?以前的这种虚拟字段的方式挺好用啊。
解决办法:设置属性TFDMemTable.UpdateOptions.CheckReadonly=true
14)主从表关系
第一步:
fdqueryDetail.MasterSource := DataSource1;
第二步:
fdqueryDetail.MasterFields := 'OrderNo'; { 多个字段时用分号隔开 }
或者
fdqueryDetail.sql.text='select * from OrderDetail where OrderMasterKey=:OrderMasterKey';
两个FDMemTable做主从怎么不起作用呢?
15)过滤数据FilterChanges
只显示修改后的数据
ClientDataSet1->FilterChanges = TFDUpdateRecordTypes() << Firedac::Comp::Dataset::rtModified;
ClientDatSet用Grideh可以排序,添加EhLibCDS.pas文件即可。
TFDMemTable添加EhLibFireDAC.pas怎么不起不能排序,报错TFDMemTable is not SQL based dataset,FDQuery排序可以了
把SortLocal=true,也不能排序,报错 TSQLDatasetFeaturesEh can not sort data in dataset "FDMemTable1" in local mode
TFDMemTable不能排序,ClientDatSet替换为TFDMemTable的进程又得延缓.
比较和跟踪源码,Delphi里TFDMemTable排序正常。c++builder新建一个工程添加内存表和数据也排序正常。
最终解决了,原来是旧的ehlib控件卸载不干净,原来的工程里还有路径和ehlib.lib文件的链接,清除后排序全部OK!
FDQuery.Fields.DataSet ?这也是数据集?
Data.DB.TFields.DataSet
Identifies the dataset to which a TFields object belongs.
A DataTable or a DataView must be supplied. Hint: if that is TFDMemTable, use CreateDataSet or CloneCursor to open dataset
TFDDataSet 基类
fdquery,dbgrideh控件的ftsum字段求和影响
C++Builder 返回数据集
_di_IFDDataSetReference
16)已有数据的FDMemTable添加列,动态添加列
原有数据集,现有数据集,现有字段,原有字段,添加新增选择列
FDMemTable2.FieldDefs := FDMemTable1.FieldDefs;
FDMemTable2.FieldDefs.Add('Test', ftString, 20 { , False } ); // default parameter
FDMemTable2.FieldDefs.Find('Test').Index := 0;
FDMemTable2.CreateDataSet; // or just Open that sets Active to true;
FDMemTable2.CopyDataSet(FDMemTable1);
17)缓存更新
FDMemTable1->ChangeCount
执行了ApplyUpdates或CommitUpdates后ChangeCount变为0
FDMemTable1->ApplyUpdates(0);
C++builder Berlin //Berlin 排序无效 2017.3.12
delphi正常
升序
self.FDMemTable1.IndexFieldNames := 'ID:A';
降序
self.FDMemTable1.IndexFieldNames := 'ID:D';
FDMemTable1->IndexFieldNames = "ID:D";
FDMemTable1->CloneCursor(m->dsModule, true, true);
CloneCurso的数据集均无法用IndexFieldNames排序。用CreateDataSet创建的数据集排序正常!
Data赋值、CopyDataSet后的数据集均排序可以正常。建议不用CloneCursor。
delphi 新版内存表 FDMemTable的更多相关文章
- 内存表 FDMemTable ClientDataSet CreateDataSet 动态创建字段
https://community.embarcadero.com/index.php/blogs/entry/firedac-in-memory-dataset-tfdmemtable Client ...
- 关于Delphi内存表的使用说明
关于Delphi内存表的使用说明: 1.建立临时表 数据输入是开发数据库程序的必然环节.在Client/Server结构中,客户端可能要输入一批数据后,再向服务器的后台数据库提交,这就需要在本地(客 ...
- kbmMemTable关于内存表的使用,以及各种三层框架的评价
关于内存表的使用(kbmMemTable) 关于内存表的使用说明一. Delphi使用内存表1.1 Delphi创建内存表步骤:1. 创建一个Ttable实例.2. 设置一个DataBaseName为 ...
- DIOCP组件(Delphi IOCP)代码阅读之ADO内存表
DIOCP组件(Delphi IOCP)代码阅读之ADO内存表 代码中有 class procedure TADOTools.loadFromStream(pvDataSet: TCustomADOD ...
- Delphi的注册表操作
转帖:Delphi的注册表操作 2009-12-21 11:12:52 分类: Delphi的注册表操作 32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创 ...
- 基于海明距离的加权平均值人职匹配模型(Sqlserver2014/16内存表实现)
最近给某大学网站制作一个功能,需要给全校所有的学生提供就业单位发布职位的自动匹配,学生登陆就业网,就可以查看适合自己的职位,进而可以在线投递. 全校有几万名学生,注册企业发布的职位也有上万,如何在很短 ...
- XP 之后, Delphi 动注册表不方便了...逼出来一个办法:
XP 之后, Delphi 动注册表不方便了...逼出来一个办法: 手头的程序需要修改注册表, 以让当前程序成为某格式的默认打开程序并关联图标; Vista 之后需要管理员权限才能操作注册表, 很麻烦 ...
- mysql的内存表和临时表
内存表: session $ mysql -uroot root@(none) ::>use test Database changed root::>CREATE TABLE tmp_m ...
- MySQL内存表-临时表
HEAP表是访问数据速度最快的MySQL表,他使用保存在内存中的散列索引.但如果MySQL或者服务器重新启动,表中数据将会丢失.用法:如论坛的在线人数统计,这种表的数据应该是无关紧要的,就几个简单的字 ...
随机推荐
- go语言学习--指针数组和数组指针
数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数据的 ...
- 使用LiteOrm删除数据对象失败的坑
使用 LiteOrm.newSingleInstance(BaseApplication.getInstance(), Constant.DB_NAME); 在不同进程中创建了两次对象,在保存和删除的 ...
- at android.view.LayoutInflater.createViewFromTag的错误原因
创建对话框时出现下面的错误: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean ...
- MySql 索引优化实例
查询语句 SELECT customer_id,title,content FROM `product_comment` WHERE audit_status=1 AND product_id=199 ...
- 2018/11/5 每日分析-test
郑醇1901,M30向上一笔中,只是看起来不太值得做,主要因为现在30分钟向上一笔空间无法判定,未必能上去(M5中枢如果向上突破并且不背驰才可能有机会:如果直接下去或者向上后背驰,那么这里就只是一个M ...
- Vsftp的PASV mode(被动模式传送)和Port模式及 Linux下VsFTP配置全方案
什么叫做PASV mode(被动模式传送)?他是如何工作的? FTP的连接一般是有两个连接的,一个是客户程和服务器传输命令的,另一个是数据传送的连接.FTP服务程序一般会支持两种不同的模式,一种是Po ...
- json.loads()的字符串中为单引号引发的错误
如下错误属于弱智错误,但是错的原因让我无语,所以记录一下 str2="{'card':6217001650004184441}"print(json.loads(str2)) Tr ...
- Linux 文件,目录,压缩,解压缩操作
2018/11/20 1.find -name 'pom.xml' | xargs perl -pi -e 's|oldString|newString|g' (批量替换) ( 命令行中使用Perl ...
- js解析多层嵌套的json,取出所有父元素属性和遍历所有子元素
已知一个多层嵌套的json,取出所有父元素和子元素的id值 思路:因为不知道到底嵌套了多少层,递归有可能造成栈溢出.查询时间特别久的问题 所以先查询一次,判断是否有子节点,如果有,取出子节点并到父节点 ...
- js语法规则 ---console.log ---- prompt ----基本类型 ---parseInt
在页面中可以在body里面加入type=”text/javascript” 例如: <script type="text/javascript"> </scrip ...