在三層結構中,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,實作自動容錯和負載平衡