TClientDataSet控件繼承自TDataSet,其數據存儲文件格式擴展名爲 .cds,是基於文件型數據存儲和操作的控件。該控件封裝了對數據進行操作處理的接口和功能,而本身並不依賴上述幾種數據庫驅動程序,基本上能滿足單機"瘦"數據庫應用程序的需要。
一、TClientDataSet的基本屬性和方法介紹
1、FieldDefs: 字段定義列表屬性
開發者可通過單擊屬性編輯器中該屬性編輯按鈕,或在該控件上單擊右鍵選擇彈出菜單中的"Fields Editor"菜單進行字段編輯。設置完此屬性後,實際上就相當於定義了表的結構;如果想裝入已有的數據表的結構和數據,可通過單擊右鍵選擇彈出菜單中的"Assign Local Data"菜單,從彈出對話框中選取當前窗體中已與數據庫連接好的數據集控件名稱即可(當前窗體中必須已放置好要套用的數據集控件並打開激活)。
使用注意:
對於自定義的字段名錶,該屬性編輯完後,該控件仍然無法打開。必須右鍵單擊該控件,選擇彈出菜單中的"Create DataSet"菜單,讓該控件以上述編輯的字段列表爲依據,創建數據集後,才能夠被激活打開和使用。否則,會出現類似"ClientDataSet1: Missing data provider or data packet."的錯誤(包括在運行期,運行期可調用該控件的CreateDataSet方法,從而動態定義字段和表)。
2、FileName屬性
說明:數據存儲文件的名稱。因該控件是基於文件型的數據操作控件,因此,必須指定所操作的數據文件名稱(默認擴展名稱.cds),從而打開和激活該控件,進而進行數據編輯。
例1:利用此屬性打開指定的.cds文件
- var
- Path: string;
- begin
- Path := ExtractFilePath(Application.ExeName); //取得可執行文件路徑
- CDataSet1.FileName := Path + 'test.cds';
- CDataSet1.Open;
- end;
3、CreateDataSet方法
說明:該方法以FieldDefs中的字段名錶爲結構建立數據集,常用來進行動態定義表。
例2:動態創建一具有姓名和年齡兩個字段的數據集。
- //創建字段名錶
- CDataSet.FieldDefs.Clear;
- with CDataSet.FieldDefs.AddFieldDef do
- begin
- Name := 'Name';
- Size := 10;
- DataType := ftString;
- end;
- with CDataSet.FieldDefs.AddFieldDef do
- begin
- Name := 'Age';
- DataType := ftInteger;
- end;
- //動態創建數據集
- CDataSet.CreateDataSet;
- //激活和打開該數據集
- CDataSet.Open;
4、Open方法
說明: 打開和激活數據集控件,從而進行數據編輯。a. 如果指定了FileName屬性,則直接用Open方法即可打開和激活該控件,見例1。b. 如果未指定FileName屬性,可使用例2方法動態創建和打開數據集,進而操作數據。
5、LoadFromFile和SaveToFile
說明:從文件中裝入表結構和數據以及存儲數據到文件。該方法類似於Word中的打開新文件和另存爲的功能。
例3:將數據集的數據存儲到指定文件中
- CDataSet.SaveToFile('C:\Windows\ZHU\Test.cds');
6、First(到首),Prior(向前),Next(向後),Last(到尾),Edit(編輯),CanCel(取消編輯),Post(保存),Insert(插入記錄),Append(添加記錄),Delete(刪除),Refresh(數據刷新)等數據集常用方法。
說明:當指定了FileName屬性時,其Post方法可將數據存入指定的文件中,類似其SaveToFile方法;如果未指定存儲文件名,則Post方法只將數據存儲在RAM中。其它方法,同一般數據集控件使用方法,略。
7、Filter, Filtered: 過濾篩選屬性
說明:用於篩選指定條件的記錄,用法同一般數據集控件,略。
例4:在已經激活打開的數據集中篩選性別爲男性的記錄
- CDataSet.Close;
- CDataSet.Filter := '性別=''' + '男' + '''';
- CDataSet.Filtered := True;
- CDataSet.Open;
二、使用TClientDataSet控件的應用程序發佈的注意事項:
如前所述,使用TClientDataSet控件的程序發佈時不需要任何數據庫驅動程序,大大節省了安裝文件的大小。但是,在發佈程序時別忘了將Windows系統目錄下midas.dll(257KB)與應用程序一起發佈(運行必須),否則,程序仍然無法正常運行。
通過使用Delphi中TClientDataSet控件,既實現了應用程序可徹底脫離數據庫驅動程序,也實現了常規數據集控件簡單易用的特性,爲編寫"瘦"數據庫應用程序提供了一種技術方法和手段。
三、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、三層結構的公文包的實現方法
同時設定:filename(*.cds)2.remote server
6、可以對data賦值(從另一個數據集取值)
- ClientDataSet2.Data:=ClientDataSet1.Data;
- ClientDataSet2.Open;
或者
- ClientDataSet2.CloneCursor(ClientDataSet1,true);
- ClientDataSet2.Open;
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)有參數
where name like :dd
則:客戶端ClientDataSet
- var
- pm:Tparam;
- begin
- ClientDataSet1.Close;
- 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 ;
- ClientDataSet1.Open;
- pm.Free;
- end;
9、數據的更新管理
(1)savepoint 保存目前爲止數據狀態,可以恢復到這個狀態
- var
- pp:integer;
- begin
- 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,實現自動容錯和負載平衡。