日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

TClientDataSet使用要点

發(fā)布時(shí)間:2023/12/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TClientDataSet使用要点 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  TClientDataSet控件繼承自TDataSet,其數(shù)據(jù)存儲(chǔ)文件格式擴(kuò)展名為 .cds,是基于文件
型數(shù)據(jù)存儲(chǔ)和操作的控件。該控件封裝了對(duì)數(shù)據(jù)進(jìn)行操作處理的接口和功能,而本身并不依
賴上述幾種數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,基本上能滿足單機(jī)"瘦"數(shù)據(jù)庫(kù)應(yīng)用程序的需要。

一、TClientDataSet的基本屬性和方法介紹

  1).FieldDefs: 字段定義列表屬性

  開(kāi)發(fā)者可通過(guò)單擊屬性編輯器中該屬性編輯按鈕,或在該控件上單擊右鍵選擇彈出菜單
中的"Fields Editor"菜單進(jìn)行字段編輯。設(shè)置完此屬性后,實(shí)際上就相當(dāng)于定義了表的結(jié)構(gòu)
;如果想裝入已有的數(shù)據(jù)表的結(jié)構(gòu)和數(shù)據(jù),可通過(guò)單擊右鍵選擇彈出菜單中的"Assign Loca
l Data"菜單,從彈出對(duì)話框中選取當(dāng)前窗體中已與數(shù)據(jù)庫(kù)連接好的數(shù)據(jù)集控件名稱即可(當(dāng)
前窗體中必須已放置好要套用的數(shù)據(jù)集控件并打開(kāi)激活)。

  使用注意:

  對(duì)于自定義的字段名表,該屬性編輯完后,該控件仍然無(wú)法打開(kāi)。必須右鍵單擊該控件
,選擇彈出菜單中的"Create DataSet"菜單,讓該控件以上述編輯的字段列表為依據(jù),創(chuàng)建
數(shù)據(jù)集后,才能夠被激活打開(kāi)和使用。否則,會(huì)出現(xiàn)類似"ClientDataSet1: Missing data
provider or data packet."的錯(cuò)誤(包括在運(yùn)行期,運(yùn)行期可調(diào)用該控件的CreateDataSet
方法,從而動(dòng)態(tài)定義字段和表)。

  2).FileName屬性

  說(shuō)明:數(shù)據(jù)存儲(chǔ)文件的名稱。

  因該控件是基于文件型的數(shù)據(jù)操作控件,因此,必須指定所操作的數(shù)據(jù)文件名稱(默認(rèn)
擴(kuò)展名稱.cds),從而打開(kāi)和激活該控件,進(jìn)而進(jìn)行數(shù)據(jù)編輯。

  例1:利用此屬性打開(kāi)指定的.cds文件

var
Path: string;
begin
 Path := ExtractFilePath(Application.ExeName); //取得可執(zhí)行文件路徑
 CDataSet1.FileName := Path + 'test.cds';
 CDataSet1.Open;
end;

  3).CreateDataSet方法

  說(shuō)明:該方法以FieldDefs中的字段名表為結(jié)構(gòu)建立數(shù)據(jù)集,常用來(lái)進(jìn)行動(dòng)態(tài)定義表。

  例2:動(dòng)態(tài)創(chuàng)建一具有姓名和年齡兩個(gè)字段的數(shù)據(jù)集。

//創(chuàng)建字段名表
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;
 //動(dòng)態(tài)創(chuàng)建數(shù)據(jù)集
 CDataSet.CreateDataSet;
 //激活和打開(kāi)該數(shù)據(jù)集
 CDataSet.Open;

  4).Open方法

  說(shuō)明: 打開(kāi)和激活數(shù)據(jù)集控件,從而進(jìn)行數(shù)據(jù)編輯。

  a. 如果指定了FileName屬性,則直接用Open方法即可打開(kāi)和激活該控件,見(jiàn)例1。

  b. 如果未指定FileName屬性,可使用例2方法動(dòng)態(tài)創(chuàng)建和打開(kāi)數(shù)據(jù)集,進(jìn)而操作數(shù)據(jù)。

  5).LoadFromFile和SaveToFile

  說(shuō)明:從文件中裝入表結(jié)構(gòu)和數(shù)據(jù)以及存儲(chǔ)數(shù)據(jù)到文件。該方法類似于Word中的打開(kāi)新
文件和另存為的功能。

  例3:將數(shù)據(jù)集的數(shù)據(jù)存儲(chǔ)到指定文件中

  CDataSet.SaveToFile('c:\windows\desktop\test.cds');

  6).First(到首),Prior(向前),Next(向后),Last(到尾),Edit(編輯),CanCel(取
消編輯),Post(保存),Insert(插入記錄),Append(添加記錄),Delete(刪除),Refresh
(數(shù)據(jù)刷新)等數(shù)據(jù)集常用方法

  說(shuō)明:當(dāng)指定了FileName屬性時(shí),其Post方法可將數(shù)據(jù)存入指定的文件中,類似其SaveT
oFile方法;如果未指定存儲(chǔ)文件名,則Post方法只將數(shù)據(jù)存儲(chǔ)在RAM中。其它方法,同一般
數(shù)據(jù)集控件使用方法,略。

  7).Filter, Filtered: 過(guò)濾篩選屬性

  說(shuō)明:用于篩選指定條件的記錄,用法同一般數(shù)據(jù)集控件,略。

  例4:在已經(jīng)激活打開(kāi)的數(shù)據(jù)集中篩選性別為男性的記錄

CDataSet.Close;
CDataSet.Filter := '性別=''' + '男' + '''';
CDataSet.Filtered := True;
CDataSet.Open;

二、使用TClientDataSet控件的應(yīng)用程序發(fā)布的注意事項(xiàng):

  如前所述,使用TClientDataSet控件的程序發(fā)布時(shí)不需要任何數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,大大節(jié)
省了安裝文件的大小。但是,在發(fā)布程序時(shí)別忘了將Windows系統(tǒng)目錄下midas.dll(257KB)與
應(yīng)用程序一起發(fā)布(運(yùn)行必須),否則,程序仍然無(wú)法正常運(yùn)行。

三、結(jié)束語(yǔ)

  通過(guò)使用Delphi中TClientDataSet控件,既實(shí)現(xiàn)了應(yīng)用程序可徹底脫離數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序
,也實(shí)現(xiàn)了常規(guī)數(shù)據(jù)集控件簡(jiǎn)單易用的特性,為編寫(xiě)"瘦"數(shù)據(jù)庫(kù)應(yīng)用程序提供了一種技術(shù)方
法和手段。

  上述程序在Pwindows98,Delphi5下測(cè)試通過(guò)。

  TClientDataSet在三層結(jié)構(gòu)中,TClientDataSet的地位是不可估量的,她的使用正確與
否,是十分關(guān)鍵的,本文從以下幾個(gè)方面闡述她的使用,希望對(duì)你有所幫助.

1.動(dòng)態(tài)索引
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if (not column.Field is Tblobfield) then//Tblobfield不能索引,二進(jìn)制
ClientDataSet1.IndexFieldNames:=column.Field.FieldName;
end;

2.多層結(jié)構(gòu)中主從表的實(shí)現(xiàn)

設(shè)主表ClientDataSet1.packetrecord為-1,所有記錄
設(shè)從表ClientDataSet1.packetrecord為0,當(dāng)前記錄

3.Taggregates使用
(1)在字段編輯中add new field類型為aggregates
后設(shè)置expression(表達(dá)試)
設(shè)置active:=true即可
使用dbedit的field為前者即可
(2)使用Aggergates屬性add設(shè)計(jì)表達(dá)試
調(diào)用
  showmessage(floattostr(ClientDataSet1.Aggregates.Count));
  showmessage(ClientDataSet1.Aggregates.Items[0].Value);
 
4.在單層數(shù)據(jù)庫(kù)中不要BDE
使用ClientDataSet代替table,使用ClientDataSet的loadfilename裝入cds
代替table的tablename的db或者dbf
原來(lái)的程序改造方法:
加一個(gè)ClientDataSet,使用右鍵assign locate data
后savetofile,再loadfromfile,后刪除table
將原連table的datasource設(shè)為ClientDataSet
唯一注意的是:要將midas.dll拷到system或者當(dāng)前目錄
5.三層結(jié)構(gòu)的公文包的實(shí)現(xiàn)方法
同時(shí)設(shè)定1:filename(*.cds)2.remote server
6.可以對(duì)data賦值(從另一個(gè)數(shù)據(jù)集取值)
ClientDataSet2.Data:=ClientDataSet1.Data;
ClientDataSet2.Open;
或者
ClientDataSet2.CloneCursor(ClientDataSet1,true);
ClientDataSet2.Open;
7.附加數(shù)據(jù)取得
客戶程序向應(yīng)用服務(wù)器請(qǐng)求數(shù)據(jù)。如果TClientDataSet 的
FetchOnDemand 屬性設(shè)為T(mén)rue,
客戶程序會(huì)根據(jù)需要自動(dòng)檢索附加的數(shù)據(jù)包如BLOB字段的值或嵌套表的內(nèi)容。
否則,
客戶程序需要顯式地調(diào)用GetNextPacket 才能獲得這些附加的數(shù)據(jù)包。
ClientDataSet的packetrecords設(shè)置一次取得的記錄個(gè)數(shù)
8.ClientDataSet與服務(wù)器端query連接方法
(1)sql內(nèi)容為空
ClientDataSet1.Close;
ClientDataSet1.CommandText:=edit1.Text;//即sql內(nèi)容
ClientDataSet1.Open;
對(duì)于沒(méi)有應(yīng)用服務(wù)器設(shè)置filter 如:country like 'A%'
filtered=true可實(shí)現(xiàn)sql功能
(2)有參數(shù)
如服務(wù)端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.數(shù)據(jù)的更新管理
(1)savepoint 保存目前為止數(shù)據(jù)狀態(tài),可以恢復(fù)到這個(gè)狀態(tài)
var
pp:integer;
begin
pp:=ClientDataSet1.SavePoint;
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('姓名').asstring:='古話';
ClientDataSet1.Post;
table1.Refresh;
end;
恢復(fù)點(diǎn)
ClientDataSet1.SavePoint:=pp;
(2)cancel,RevertRecord
取消對(duì)當(dāng)前記錄的修改,只適合沒(méi)有post的,如果post,調(diào)用
RevertRecord
(3)cancelupdate
取消對(duì)數(shù)據(jù)庫(kù)所有的修改
(4)UndoLastChange(boolean),changecount
取消上一次的修改,可以實(shí)現(xiàn)連續(xù)撤消
參數(shù)為true:光標(biāo)到恢復(fù)處
false:光標(biāo)在當(dāng)前位置不動(dòng)
changecount返回修改記錄的次數(shù),一個(gè)記錄修改多次,返回只一次
但UndoLastChange只撤消一次

10.可寫(xiě)的recno
對(duì)于Ttable和Tquery的recno是只讀的,而TClientDataSet的recno可讀可寫(xiě)
ClientDataSet1.recno:=5;是設(shè)第五個(gè)記錄為當(dāng)前記錄
11.數(shù)據(jù)保存
對(duì)于table使用post可更新數(shù)據(jù)
而ClientDataSet1的post只更新內(nèi)存數(shù)據(jù),要更新服務(wù)器數(shù)據(jù)要使用
ApplyUpdates(MaxErrors: Integer),他有一個(gè)參數(shù),是允許發(fā)出錯(cuò)誤的
次數(shù),-1表示無(wú)數(shù)次,使用simpleobjectbroker時(shí)常設(shè)為0,實(shí)現(xiàn)自動(dòng)容錯(cuò)和負(fù)載平衡

?

轉(zhuǎn)載于:https://www.cnblogs.com/spiritofcloud/p/3980370.html

總結(jié)

以上是生活随笔為你收集整理的TClientDataSet使用要点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。