TClientDataSet的使用以及遇到的坑

在Delphi未加入FireDAC以前,彷佛是沒有內存表控件的(也許有,可能我不知道吧),可是能夠用TClientDataSet控件來作內存表使用,即便有了FireDAC能夠使用TFDMemTable,我仍是以爲TClientDataSet更好用一些。緩存

作內存表使用

建立

with ClientDataSet do
  begin
    Close;
    //定義字段
    with FieldDefs do
    begin
      Clear;
      Add('Field1', ftInteger, 0, False);
      Add('Field2', ftString, 0, False);
      ......
    end;
    //建立結構
    CreateDataSet;
    Open;
  end;

排序

在定義字段後,建立結構前,也能夠指定排序字段。ide

IndexFieldNames := 'Field1';

作緩存使用

須要結合TDataSetProvider來使用。如下示例以使用ADO組件爲例。設計

拉取數據

方法1

TDBGrid->TDataSource->TClientDataSet->TDataSetProvider->TADOQuery->TADOConnectioncode

ClientDataSet.ProviderName := DataSetProvider.Name; //設計器裏設置過就不須要了
  with ClientDataSet do
  begin
    Close;
    CommandText:='select * from T_Table';
    Open;
  end;

方法2

TDBGrid->TDataSource排序

TClientDataSet->TDataSetProvider->TADOQuery->TADOConnection內存

ClientDataSet.Data := DataSetProvider.Data;

提交數據

使用方法1時,能夠直接使用下面的語句:it

ClientDataSet.ApplyUpdates(-1);
  //或
  DataSetProvider.ApplyUpdates(ClientDataSet.Date, -1, Count);

按理說這樣就能夠了,並且不須要寫SQL語句,但事實是Insert通常沒問題,Update就很容易出錯,因此提交仍是本身老老實實寫SQL語句比較保險io

with ClientDataSet do
  begin
    First;
    while not Eof do
    begin
      case UpdateStatus of
        usModified:
          begin
            //更新處理
          end;
        usInserted:
          begin
            //插入處理
          end;
        usDeleted:
          begin
            //刪除處理
          end;
      end;
      Next;
    end;
  end;
相關文章
相關標籤/搜索