内存表(FDMEMTABLE)
内存表的优点是快,非常快,号称比BDE的clientdataset快很多。
内存表不但快,还可以另存为XML、BIN、CSV等数据。
也可直接作为stream传送。
所以,追求速度的时候,获得数据后即解除锁定的时候,都可能需要用到内存表。
内存表也可用于把来自其他数据库管理系统的数据表存储为FIREDAC的数据表。
内存表的控件是:TFDMEMTABLE。
1、拷贝数据
内存表拷贝另一个表的数据非常简单,使用例子如下:
FDMemTable1.CloneCursor(FDQuery1, False, False);
从另一个数据集中拷贝数据的最快方法是:
FDMemTable1.CopyDataSet(DataSet1, [coStructure, coRestart, coAppend]);
三个参数分别是:包括结构,从第一个数据开始拷贝,添加在数据集的后面。
如果数据来源是firedac的数据集,则还有第三种方式:
FDQuery1.FetchOptions.Undirectional := False;//此项应该设置为false,不然数据可能不全; FDQuery1.Open; FDQuery1.FetchAll;//获取所有数据 FDMemTable1.Data := FDQuery1.Data; FDMemTable1.First; while not FDMemTable1.Eof do begin FDMemTable1.Edit; ....... FDMemTable1.Post; FDMemTable1.Next; end;
2、内存表操作
内存表的操作和一般表的操作一样,创建表:
with FDMemTable1.FieldDefs do begin with AddFieldDef do begin Name := 'f1'; DataType := ftInteger; end; with AddFieldDef do begin Name := 'f2'; DataType := ftString; Size := 50; end; end;
添加数据:
with FDMemTable1 do begin Open; Append; Fields[0].AsInteger := ...; Fields[1].AsString := ...; Post; end;
3、内存表有什么用?
如果你只是使用FIREDAC,则很多功能都可使用TFDQUERY或TFDSTOREDPROC来实现,除非你有例如只使用纯内存数据或防止锁定等需求时,否则TFDMEMTABLE用处确实不大。
但你可以:
- 使用TFDMEMTABLE来克隆来自其它数据集的数据;
- 读取CSV格式的本地数据,然后使用LOCALSQL查询此CSV数据。
4、可回滚的操作
内存表可通过TFDADAPTER连接一个数据表,然后对这个数据表进行添加删除等等操作,所有的操作都是在内存中进行的,如果要把操作写入数据库中的数据表,则只需要ApplyUpdates即可。
这样可以在误操作之间添加一层安全防护。
具体实现方法如下:
(1)、使用TFDCommand的select语句查询数据集。
(2)、使用TFDTableAdapter来连接TFDMemTable和TFDCommand,具体就是其selectcommand设置为TFDCommand,而tfdmemtable的adapter属性设置为TFDTableAdapter。
(3)、对tfdmemtable的所有修改都记录在memtable中,但只要没有提交,就不会反馈到数据集中。如果回滚,则重新从fdcommand中查询的数据替换内存表的数据。
当然,如果只是这样,其特色也不算明显。其实tfdadpter是通过记录修改LOG,并应用修改LOG来实现回滚的,因此,你可以:
在当前行执行RevertRecord来取消当前行的操作。
执行UndoLastChange 来取消最后一次的操作;
执行CancelUpdates来取消所有的操作。