Delphi中ClientDataSet的用法小結
Delphi中ClientDataSet的用法小結
TClientDataSet控制元件繼承自TDataSet,其資料儲存檔案格式副檔名為 .cds,是基於檔案型資料儲存和操作的控制元件。該控制元件封裝了對資料進行操作處理的介面和功能,而本身並不依賴上述幾種資料庫驅動程式,基本上能滿足單機"瘦"資料庫應用程式的需要。
一、TClientDataSet的基本屬性和方法介紹
1、FieldDefs: 欄位定義列表屬性
開發者可通過單擊屬性編輯器中該屬性編輯按鈕,或在該控制元件上單擊右鍵選擇彈出選單中的"Fields Editor"選單進行欄位編輯。設定完此屬性後,實際上就相當於定義了表的結構;如果想裝入已有的
使用注意:
對於自定義的欄位名錶,該屬性編輯完後,該控制元件仍然無法開啟。必須右鍵單擊該控制元件,選擇彈出選單中的"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 animalswhere 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,實現自動容錯和負載平衡。