1. 程式人生 > 實用技巧 >Delphi中ClientDataSet的用法小結

Delphi中ClientDataSet的用法小結

Delphi中ClientDataSet的用法小結

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)有引數

如服務端query的sql為 select * from animals
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,實現自動容錯和負載平衡。