内存表(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来取消所有的操作。

posted @ 2022-11-22 08:56  Luo大哥  阅读(1164)  评论(0编辑  收藏  举报