天天看點

TClientDataSet的使用技巧

在三層結構中,TClientDataSet的地位是不可估量的,她的使用正确與否,是十分關鍵的,

本文從以下幾個方面闡述她的使用,希望對你有所幫助.

1.動态索引

procedure TForm1.DBGrid1TitleClick(Column: TColumn);

begin

if (not column.Field is Tblobfield) then//Tblobfield不能索引,二進制

ClientDataSet1.IndexFieldNames:=column.Field.FieldName;

end;

2.多層結構中主從表的實作

設主表ClientDataSet1.packetrecord為-1,所有記錄

設從表ClientDataSet1.packetrecord為0,目前記錄

3.Taggregates使用

(1)在字段編輯中add new field類型為aggregates

     後設定expression(表達試)

     設定active:=true即可

     使用dbedit的field為前者即可

(2)使用Aggergates屬性add設計表達試

    調用

  showmessage(floattostr(ClientDataSet1.Aggregates.Count));

  showmessage(ClientDataSet1.Aggregates.Items[0].Value);

 

4.在單層資料庫中不要BDE

  使用ClientDataSet代替table,使用ClientDataSet的loadfilename裝入cds

  代替table的tablename的db或者dbf

  原來的程式改造方法:

  加一個ClientDataSet,使用右鍵assign locate data

  後savetofile,再loadfromfile,後删除table

  将原連table的datasource設為ClientDataSet

  唯一注意的是:要将midas.dll拷到system或者目前目錄

5.三層結構的公文包的實作方法

 同時設定1:filename(*.cds)2.remote server

6.可以對data指派(從另一個資料集取值)

 ClientDataSet2.Data:=ClientDataSet1.Data;

 ClientDataSet2.Open;

 或者

 ClientDataSet2.CloneCursor(ClientDataSet1,true);

7.附加資料取得

  客戶程式向應用伺服器請求資料。如果TClientDataSet 的

  FetchOnDemand 屬性設為True,

  客戶程式會根據需要自動檢索附加的資料包如BLOB字段的值或嵌套表的内容。

  否則,

  客戶程式需要顯式地調用GetNextPacket 才能獲得這些附加的資料包。

  ClientDataSet的packetrecords設定一次取得的記錄個數

8.ClientDataSet與伺服器端query連接配接方法

  (1)sql内容為空

     ClientDataSet1.Close;

     ClientDataSet1.CommandText:=edit1.Text;//即sql内容

     ClientDataSet1.Open;

   對于沒有應用伺服器設定filter 如:country like 'A%'

   filtered=true可實作sql功能

  (2)有參數

   如服務端query的sql為

    select * from animals

    where name like :dd

   則:用戶端ClientDataSet

   var

   pm:Tparam;

  begin

     ClientDataSet1.ProviderName:='DataSetProvider1';

     pm:=Tparam.Create(nil);

     pm.Name:='dd';

     pm.DataType:=ftString;

     ClientDataSet1.Params.Clear;

     ClientDataSet1.Params.AddParam(pm);

     ClientDataSet1.Params.ParamByName('dd').AsString:=edit1.Text ;

     pm.Free;

  end;

9.資料的更新管理

  (1)savepoint 儲存目前為止資料狀态,可以恢複到這個狀态

  var

    pp:integer;

     pp:=ClientDataSet1.SavePoint;

     ClientDataSet1.Edit;

     ClientDataSet1.FieldByName('姓名').asstring:='古話';

     ClientDataSet1.Post;

     table1.Refresh;

   end;

  恢複點

    ClientDataSet1.SavePoint:=pp;

  (2)cancel,RevertRecord

       取消對目前記錄的修改,隻适合沒有post的,如果post,調用

   RevertRecord

   (3)cancelupdate

    取消對資料庫所有的修改

  (4)UndoLastChange(boolean),changecount

    取消上一次的修改,可以實作連續撤消

    參數為true:光标到恢複處

          false:光标在目前位置不動

   changecount傳回修改記錄的次數,一個記錄修改多次,傳回隻一次

   但UndoLastChange隻撤消一次

10.可寫的recno

   對于Ttable和Tquery的recno是隻讀的,而TClientDataSet的recno可讀可寫

   ClientDataSet1.recno:=5;是設第五個記錄為目前記錄

11.資料儲存

  對于table使用post可更新資料

  而ClientDataSet1的post隻更新記憶體資料,要更新伺服器資料要使用

  ApplyUpdates(MaxErrors: Integer),他有一個參數,是允許發出錯誤的

  次數,-1表示無數次,使用simpleobjectbroker時常設為0,實作自動容錯和負載平衡