首页 > 系统相关 >内存表(FDMEMTABLE)

内存表(FDMEMTABLE)

时间:2022-11-22 09:00:30浏览次数:45  
标签:do FDQuery1 FDMemTable1 数据表 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来取消所有的操作。

标签:do,FDQuery1,FDMemTable1,数据表,FDMEMTABLE,内存,数据
From: https://www.cnblogs.com/luohq001/p/16914068.html

相关文章

  • Day18.2:对象创建的内存分析图解
    对象创建的内存分析我们从两块最常用的内存空间对对象创建进行内存分析堆内存:存放的是对象的具体信息;在程序之中堆内存空间的开辟是通过new完成的栈内存:存放的是对象的......
  • Kotlin | 这些隐藏的内存陷阱,你应该熟记于心
    引言​​Kotlin​​是一个非常yes的语言,从null安全,支持方法扩展与属性扩展,到内联方法、内联类等,使用Kotlin变得越来越简单舒服。但编程从来不是一件简单的工作,所......
  • 内存四区
         ......
  • innodb中内存管理机制BufferPool
    ​内存结构 InnoDB主索引是聚簇索引,索引与数据共用表空间,对于InnoDB而言,数据就是索引,索引就是数据。InnoDB缓存机制和MyISAM缓存机制的最大区别就是在于,InnoDB不仅仅是缓存......
  • mysql中CPU或内存利用率过高问题
    CPU利用率过高原因在MySQL使用过程中,出现CPU利用率过高甚至超过100%时,与数据库存在低效SQL或大量行锁冲突有非常大的关系,一般都是由于大量低效的SQL导致,出现行锁冲......
  • 17.5 稀疏调拨的内存映射文件--《Windows核心编程》
    原文链接:https://www.likecs.com/show-306421749.html,原文中代码是C++MFC程序,更详细。本文是C语言测试代码。(1)稀疏文件(SparseFile)定义指的是文件中出现大量的0数据,这......
  • 17.1 使用内存映射文件--《Windows核心编程》
    Windows提供了以下三种机制来对内存进行操控虚拟内存:最适合用来管理大量对象数组或者大型数据结构内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运......
  • 17.2 内存映射文件的一致性--《Windows核心编程》
    系统允许我们把同一个文件映射到多个视图中,只要映射的是同一个文件映射对象,系统会保证各视图中数据是一致的。例如一个程序修改了一个视图内的内容,那么系统会更新所有其他......
  • 17.3 给内存映射文件指定基地址--《Windows核心编程》
    可以使用MapViewOfFileEx函数,建议系统把文件映射到指定的地址。其他参数与MapViewOfFile相同,最后一个参数pvBaseeAddress指定目标地址。同VirtualAlloc,指定的地址......
  • 48、OAK通过共享内存传递变长结构体(Rapidjson)进行数据和图片交互
    基本思想:主要学习一下在共享内存中传递变长的数据,这样在c#调用c++dll也可以雷同操作,以oak的检测和共享内存为代码整合,集成了rapidjson的使用,代码自己摘要和参考吧cmakelist......