記憶體表(FDMEMTABLE)

沧江魅影發表於2024-08-18

記憶體表的優點是快,非常快,號稱比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來取消所有的操作。

相關文章