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