ClientDataSet的用法(转) - CNQCJ 的Delphi 博客 - 博客园

合集下载

ClientDataset的使用

ClientDataset的使用

ClientDataset的使用ClientDataset的使用嵌套ClientDataset:1: 当ClientDataset.packetRecords=-1时,不论客户端的ClientDataset.fetchOnDemand和服务端的DatasetProvider.FetchDetailOnDemand如何设置均会导致速度下降到难以忍受。

1.1原因解析:因为服务端datasetProvider指向的主表Dataset 会在刚打开时就为每一条纪录整理其Detail数据(循环发送Sql语句到数据库,并cache到子表的dataset,供以后的Filter使用)。

所以服务端的Dataset打开会非常慢。

1.2:解决方案:只有返回一条以编辑或增加一条主表纪录时才使用嵌套ClientDataset。

其他浏览时应动态刷新Detail控件。

1.3或者设定ClientDataset.packetRecords为一个比较小的值(100以内)。

1.3 clientdataset的fetchonDemand属性。

基本不影响速度(它不影响无服务端封装Detail的行为)。

它只设定clientdataset.next时是否自动GetNextPacket.1.4 DatasetProvider.FetchDetailOnDemand;使用Table作为子表会影响一倍左右的速度(1条主表纪录对应平均4条子表纪录时。

使用query作子表时速度基本一样。

)1.5 不论ClientDataset.packetRecords如何设置,服务端的主表qry都从数据库中一次取出全部纪录。

1.6 慎用ClientDataset.IndexName,它会导致读入所有纪录到客户端。

2、结论:对于存在主子表显示或编辑要求的客户端需要使用PacketRecords属性设为较小值。

(此类客户端一般不会要求显示太多数据)。

可以将服务端的DatasetProvider.FetchDetailOnDemand设置为false影响不大,还可简化客户端代码。

ClientDataSet的用法(转)-CNQCJ的Delphi博客-博客园

ClientDataSet的用法(转)-CNQCJ的Delphi博客-博客园

ClientDataSet的用法(转)-CNQCJ的Delphi博客-博客园ClientDataSet的用法(转)TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds,是基于文件型数据存储和操作的控件。

该控件封装了对数据进行操作处理的接口和功能,而本身并不依赖上述几种数据库驱动程序,基本上能满足单机"瘦"数据库应用程序的需要。

1.TClientDataSet的基本属性和方法介绍1).FieldDefs: 字段定义列表属性开发者可通过单击属性编辑器中该属性编辑按钮,或在该控件上单击右键选择弹出菜单中的"Fields Editor"菜单进行字段编辑。

设置完此属性后,实际上就相当于定义了表的结构;如果想装入已有的数据表的结构和数据,可通过单击右键选择弹出菜单中的"Assign Local Data"菜单,从弹出对话框中选取当前窗体中已与数据库连接好的数据集控件名称即可(当前窗体中必须已放置好要套用的数据集控件并打开激活)。

使用注意:对于自定义的字段名表,该属性编辑完后,该控件仍然无法打开。

必须右键单击该控件,选择弹出菜单中的"Create DataSet"菜单,让该控件以上述编辑的字段列表为依据,创建数据集后,才能够被激活打开和使用。

否则,会出现类似"ClientDataSet1: Missing data provider or data packet."的错误(包括在运行期,运行期可调用该控件的CreateDataSet方法,从而动态定义字段和表)。

2).FileName属性说明:数据存储文件的名称。

因该控件是基于文件型的数据操作控件,因此,必须指定所操作的数据文件名称(默认扩展名称.cds),从而打开和激活该控件,进而进行数据编辑。

例1:利用此属性打开指定的.cds文件varPath: string;beginPath := ExtractFilePath(Application.ExeName); //取得可执行文件路径CDataSet1.FileName := Path + 'test.cds';CDataSet1.Open;end;3).CreateDataSet方法说明:该方法以FieldDefs中的字段名表为结构建立数据集,常用来进行动态定义表。

delphi三层开辟tclientdataset的delta妙用[最新]

delphi三层开辟tclientdataset的delta妙用[最新]

Delphi三层开发小技巧:TClientDataSet的Delta妙用Delphi做三层开发时,很多人都会在客户端放一个TClientDataSet,中间层远程数据模块就对应放一个TDataSetProvider,然后再连起来.其实这种方法很烦琐,而且程序痈肿不甘,不好维护.我们都知道TClientDataSet的Delta属性记录了数据的所有修改,应用它我们就可以方便的实现一个单表更新的通用方法.首先,在中间层添加一个方法,就叫ApplyUpdates吧.方法定义如下:function ApplyUpdates(const UpdateTable:String;Delta:Variant;out err:String):Boolean;参数UpdateTable是指要更新的表名,Delta是指传过来的TClientDataSet的Delta属性,如果更新错误err返回错误的内容.下面实现这个方法,首先在DataModule上放一个Query,Query连上Connection,然后再放一个TDataSetProvider连Query.代码如下:function TRoDm.ApplyUpdates(const UpdateTable:String;Delta:Variant;out err:String):Boolean;const sql='select * from %s where 1<>1';var sqlstr:string;ErrCount:Integer;beginResult:=False;sqlstr:=Format(sql,[UpdateTable]);tryConn.BeginTrans;Query.Close;Query.sql.text:=sqlstr;Query.open;Provider.ApplyUpdates(Delta,-1,ErrCount);Result:=ErrCount=0;if Result thenmitTranselse Conn.RollbackTrans;excepton E:Exception dobeginConn.RollbackTrans;err:=E.Message;end;end;end;到此,通用的更新方法已经完成了.不过客户端的ClientDataSet还不能查询显示数据,因此,还要写一个查询方法:function QuerySQL(const sqlstr:string;out Data:Variant;outerr:String):Boolean;参数sqlstr就是要持行的查询语句,Data返回查询结果,错误时err返回错误消息QuerySQL实现代码如下:function TRoDm.QuerySQL(const sqlstr:string;out Data:Variant;out err:String):Boolean;beginResult:=False;tryQuery.close;Query.sql.text:=sqlstr;Query.sql.Open;Data:=Provider.Data;Result:=True;Excepton E:Exception doerr:=E.Message;end;end;到这里,中间层的代码已经完了,客户端的调用就简单了.比如客户端有个数据模块DM,上面放一个DcomConnection或者SocketConnection,名叫Conn.例如,我们现在要做一个商品管理的功能,在窗体上放一个TClientDataSet叫Cds,放DataSource,DBGrid等,设置好相应的属性.然后在窗体创建(Create事件)时查询回所有数据,代码如下:const sql='select * from xxxx';var Data:Variant;err:String;beginif Dm.Conn.AppServer.QuerySQL(sql,Data,err) thenCds.Data:=Dataelse MessageBox(self.handle,pchar('查询数据出错:'+err),'错误',MB_OK+MB_ICONERROR);end;然后还有"添加","修改","删除"按扭,代码都和我们平时操作一样,比如"添加"按扭的代码:cds.append;cds.fieldbyname('xxx').asinteger:=xxx;//....cds.post;修改,删除也这样写.不过现在还有个小问题是,这个表的主键的生成问题,这里我们不能用自增主键,要自己自己生成主键,这样你还得在中间层写一个中间层生成主键的方法,在"增加"按扭时生调用生成主键,然后再上面的操作.这里不再多说.增删改完后,这时的数据还在客户端的内存里,想保存到远程的中间层服务器就要用到我们刚才的方法了,下面就是"保存"按扭下的代码:var err:string;beginif cds.ChangeCount=0 then exit;//数据没改变就不用提交了if Dm.Conn.AppServer.ApplyUpdates('xxx',cds.Delta,err) then//xxx就是表名了beginMessageBox(self.handle,'保存成功!','提示',MB_OK+MB_ICONINFORMATION);cds.MergeChangeLog;//合并所有改变的数据end else MessageBox(self.handle,pchar('保存出错:'+err),'错误',MB_OK+MB_ICONERROR);end;到此,这篇文章也讲完了.用这个方法,那些单表的基础数据更新还可以写成一个祖先类,只要加一个取得更新表名的虚方法,比如:functionTableName:string;virtual;然后其后代只要override这个方法,返回各自的表名,其他的一句代码都不用写.scktsrvr.exe是一个NT的服务程序,你用scktsrvr.exe -install安装之后,每次系统启动,它都会自动运行的。

ListView在delphi中的常用用法

ListView在delphi中的常用用法

ListView在delphi中的常⽤⽤法ListView在delphi中的常⽤⽤法//增加i := ListView1.Items.Count;with ListView1 dobeginListItem:=Items.Add;ListItem.Caption:=IntToStr(i);ListItem.SubItems.Add('第'+IntToStr(i)+' ⾏');ListItem.SubItems.Add('第三列内容');end;//按标题删除for i:=ListView1.Items.Count-1downto0 Doif ListView1.Items.Caption = Edit1.Text thenbeginListView1.Items.Item.Delete(); //删除当前选中⾏end;//选中⼀⾏if ListView1.Selected <> nil thenEdit1.Text := ListView1.Selected.Caption;// listview1.Items[Listview1.Items.Count -1].Selected := True;// listview1.Items[Listview1.Items.Count -1].MakeVisible(True);//选择第⼀条procedure TForm1.Button2Click(Sender: TObject);beginlistview1.SetFocus;listview1.Items[0].Selected := True;end;//选择最后⼀条procedure TForm1.Button1Click(Sender: TObject);beginlistview1.SetFocus;listview1.Items[Listview1.Items.Count -1].Selected := True;end;//此为调⽤过程,可以任意指定要移动的Item,下⾯是当前(Selected)Itemprocedure ListViewItemMoveUpDown(lv : TListView; Item : TListItem; MoveUp, SetFocus : Boolean); varDestItem : TListItem;beginif (Item = nil) or((Item.Index - 1 < 0) and MoveUp) or((Item.Index + 1 >= lv.Items.Count) and (not MoveUp))then Exit;lv.Items.BeginUpdate;tryif MoveUp thenDestItem := lv.Items.Insert(Item.Index - 1)elseDestItem := lv.Items.Insert(Item.Index + 2);DestItem.Assign(Item);lv.Selected := DestItem;Item.Free;finallylv.Items.EndUpdate;end;if SetFocus then lv.SetFocus;DestItem.MakeVisible(False);end;ListViewItemMoveUpDown(ListView1, ListView1.Selected, True, True);//上移ListViewItemMoveUpDown(ListView1, ListView1.Selected, False, True);//下移TListView组件使⽤⽅法引⽤CommCtrl单元procedure TForm1.Button1Click(Sender: TObject);beginListView_DeleteColumn(MyListView.Handle, i);//i是要删除的列的序号,从0开始end;⽤LISTVIEW显⽰表中的信息:procedure viewchange(listv:tlistview;table:tcustomadodataset;var i:integer);begintlistview(listv).Items.BeginUpdate; {listv:listview名}trytlistview(listv).Items.Clear;with table do {table or query名}beginactive:=true;first;while not eof dobeginlistitem:=tlistview(listv).Items.add;listitem.Caption:=trim(table.fields[i].asstring);// listitem.ImageIndex:=8;next;end;end;finallytlistview(listv).Items.EndUpdate;end;end;ListView使⽤中的⼀些要点。

DelphiListView基本用法大全

DelphiListView基本用法大全

DelphiListView基本⽤法⼤全Delphi ListView基本⽤法⼤全//增加项或列(字段)ListView1.Clear;ListView1.Columns.Clear;ListView1.Columns.Add;ListView1.Columns.Add;ListView1.Columns.Add;ListView1.Columns.Items[0].Caption:='id';ListView1.Columns.Items[1].Caption:='type';ListView1.Columns.Items[2].Caption:='title';ListView1.Columns.Items[2].Width:=300;Listview1.ViewStyle:=vsreport;Listview1.GridLines:=true; //注:此处代码也可以直接在可视化编辑器中完成,也可写成以下这样beginwith listview1 dobeginColumns.Add;Columns.Add;Columns.Add;ViewStyle:=vsreport;GridLines:=true;columns.items[0].caption:='进程名';columns.items[1].caption:='进程ID';columns.items[2].caption:='进程⽂件路径';Columns.Items[0].Width:=100;Columns.Items[1].Width:=100;Columns.Items[2].Width:=150;endend;//增加记录with listview1.items.add dobegincaption:='1212';subitems.add('hh1');subitems.add('hh2');end;//删除listview1.items.delete(0);//从数据库表⾥读取数据写⼊ListviewvarTitem:Tlistitem; //此处⼀定要预定义临时记录存储变量. beginListView1.Items.Clear;with adoquery1 dobeginclose;sql.Clear;sql.Add('select spmc,jg,sl from kcxs');Open;ListView1.Items.Clear;while not eof dobeginTitem:=ListView1.Items.add;Titem.Caption:=FieldByName('spmc').Value;Titem.SubItems.Add(FieldByName('sl').Value); Titem.SubItems.Add(FieldByName('jg').Value);next;end;//删除ListView1.DeleteSelected;//如何取得ListView中选中⾏的某⼀列的值procedure TForm1.Button2Click(Sender: TObject);beginShowMessage(ListView1.Selected.SubItems.Strings[1]); //返回选中⾏第三列中的值end;showMessage(listView1.Selected.Caption); //返回选中⾏第⼀列的值.第1列的值: -->>> ListView1.Selected.Caption第i列的值(i>1):-->>> ListView1.Selected.SubItems.Strings[i]ListView1.Items.Item[1].SubItems.GetText); //取得listview某⾏某列的值Edit2.Text := listview1.Items[i].SubItems.strings[0]; //读第i⾏第2列返回选中⾏所有⼦列值.是以回车符分开的,你还要从中剥离出来你要的⼦列的值。

delphi 中集合用法

delphi 中集合用法

Delphi 中集合用法1. 概述在 Delphi 中,集合(Collections)是一种用来存储和操作多个数据元素的数据结构。

集合的使用可以提高代码的可读性和可维护性,并且提供了各种方便的方法,用于访问、添加、删除和搜索集合中的元素。

本文将介绍 Delphi 中集合的基本用法,并深入探讨集合的常见操作和性能优化技巧。

2. 集合类型Delphi 提供了多种集合类型,包括:2.1. TListTList 是 Delphi 中最常用的集合类型之一,它可以存储不同类型的元素,并且提供了各种方法用于对元素进行操作。

可以使用 Add 方法向 TList 中添加元素,使用 Delete 方法删除元素,使用 Count 属性获取元素数量,使用 IndexOf 方法查找元素等。

2.2. TObjectListTObjectList 是 TList 的一个变体,它专门用于存储 TObject 类型的元素。

TObjectList 继承自 TList,并且添加了一些针对对象操作的特定方法。

例如,可以使用 OwnsObjects 属性来控制对象是否在列表销毁时一同被销毁。

2.3. TStringsTStrings 是一个用于存储字符串的集合类型。

它是 TList 的一个子类,但专门用于存储字符串类型的元素。

TStrings 提供了一些方便的方法,用于对字符串进行操作,例如 Add、Delete、Insert、IndexOf 等。

2.4. TQueue 和 TStackTQueue 和 TStack 分别是队列和栈的实现,它们分别按照先进先出(FIFO)和后进先出(LIFO)的原则存储和访问元素。

TQueue 提供了 Enqueue 方法用于将元素添加到队列尾部,使用 Dequeue 方法从队列头部获取并移除元素。

TStack 提供了Push 方法用于将元素推入栈顶,使用 Pop 方法从栈顶获取并移除元素。

2.5. TDictionaryTDictionary 是一个用于存储键值对的集合类型,类似于 Delphi 中的字典或映射。

TClientDataSet的使用技巧

TClientDataSet的使用技巧
次数,-1表示无数次,使用simpleobjectbroker时常设为0,实现自动容错和负载平衡
(出处:)
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,所有记录
(2)使用Aggergates属性add设计表达试
调用
showmessage(floattostr(ClientDataSet1.Aggregates.Count));
showmessage(ClientDataSet1.Aggregates.Items[0].Value);
6.可以对data赋值(从另一个数据集取值)
ClientDataSet2.Data:=ClientDataSet1.Data;
ClientDataSet2.Open;
或者
ClientDataSet2.CloneCursor(ClientDataSet1,true);
ClientDataSet2.Open;
则:客户端ClientDataSet

delphi datasetprovider 用法

delphi datasetprovider 用法

delphi datasetprovider 用法DataSetProvider 是 Delphi 中用于数据集的提供者组件。

它可以将数据集的数据提供给其他数据感知控件,如 DBGrid、DBNavigator 等。

DataSetProvider 的用法如下:1. 在 Delphi 的控件面板中找到 DataSetProvider 组件,并将其放置在窗体或数据模块中。

2. 使用对象控制台或属性编辑器来设置 DataSetProvider 的属性。

- DataSet:指定要提供数据的数据集。

可以是任何继承自TDataSet 的数据集,如 TTable、TQuery、TFDMemTable 等。

- Name:为 DataSetProvider 指定一个名称。

- Options:指定一些选项,如 poAllowCommandText、poAllowMetaData 等。

3. 针对所连接的数据集,设置 DataSetProvider 的事件。

- OnUpdateData:此事件在更新数据集时触发。

您可以在此事件中实现自定义的数据更新逻辑。

- BeforeUpdateRecord:此事件在更新数据集记录之前触发。

您可以在此事件中进行一些预处理操作。

- AfterUpdateRecord:此事件在更新数据集记录后触发。

您可以在此事件中执行一些后续处理操作。

- BeforeGetRecords:此事件在获取数据集记录之前触发。

您可以在此事件中进行一些预处理操作。

- AfterGetRecords:此事件在获取数据集记录后触发。

您可以在此事件中执行一些后续处理操作。

4. 连接数据感知控件到 DataSetProvider,使其能够使用提供的数据。

- 将一个 TDataSource 控件放置在窗体或数据模块中,将其DataSet 属性设置为 DataSetProvider。

- 将其他数据感知控件的 DataSource 属性设置为该 TDataSource 控件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ClientDataSet的用法(转)- CNQCJ 的Delphi 博客- 博客园ClientDataSet的用法(转)TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds,是基于文件型数据存储和操作的控件。

该控件封装了对数据进行操作处理的接口和功能,而本身并不依赖上述几种数据库驱动程序,基本上能满足单机"瘦"数据库应用程序的需要。

1.TClientDataSet的基本属性和方法介绍1).FieldDefs: 字段定义列表属性开发者可通过单击属性编辑器中该属性编辑按钮,或在该控件上单击右键选择弹出菜单中的"Fields Editor"菜单进行字段编辑。

设置完此属性后,实际上就相当于定义了表的结构;如果想装入已有的数据表的结构和数据,可通过单击右键选择弹出菜单中的"Assign Local Data"菜单,从弹出对话框中选取当前窗体中已与数据库连接好的数据集控件名称即可(当前窗体中必须已放置好要套用的数据集控件并打开激活)。

使用注意:对于自定义的字段名表,该属性编辑完后,该控件仍然无法打开。

必须右键单击该控件,选择弹出菜单中的"Create DataSet"菜单,让该控件以上述编辑的字段列表为依据,创建数据集后,才能够被激活打开和使用。

否则,会出现类似"ClientDataSet1: Missing data provider or data packet."的错误(包括在运行期,运行期可调用该控件的CreateDataSet方法,从而动态定义字段和表)。

2).FileName属性说明:数据存储文件的名称。

因该控件是基于文件型的数据操作控件,因此,必须指定所操作的数据文件名称(默认扩展名称.cds),从而打开和激活该控件,进而进行数据编辑。

例1:利用此属性打开指定的.cds文件varPath: string;beginPath := ExtractFilePath(Application.ExeName); //取得可执行文件路径CDataSet1.FileName := Path + 'test.cds';CDataSet1.Open;end;3).CreateDataSet方法说明:该方法以FieldDefs中的字段名表为结构建立数据集,常用来进行动态定义表。

例2:动态创建一具有姓名和年龄两个字段的数据集。

//创建字段名表CDataSet.FieldDefs.Clear;with CDataSet.FieldDefs.AddFieldDef dobeginName := 'Name';Size := 10;DataType := ftString;end;with CDataSet.FieldDefs.AddFieldDef dobeginName := '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\desktop\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;2.使用TClientDataSet控件的应用程序发布的注意事项:如前所述,使用TClientDataSet控件的程序发布时不需要任何数据库驱动程序,大大节省了安装文件的大小。

但是,在发布程序时别忘了将Windows系统目录下midas.dll(257KB)与应用程序一起发布(运行必须),否则,程序仍然无法正常运行。

三、结束语通过使用Delphi中TClientDataSet控件,既实现了应用程序可彻底脱离数据库驱动程序,也实现了常规数据集控件简单易用的特性,为编写"瘦"数据库应用程序提供了一种技术方法和手段。

上述程序在Pwindows98,Delphi5下测试通过。

TClientDataSet在三层结构中,TClientDataSet的地位是不可估量的,她的使用正确与否,是十分关键的,本文从以下几个方面阐述她的使用,希望对你有所帮助.1.动态索引procedure TForm1.DBGrid1TitleClick(Column: TColumn); beginif (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 server6.可以对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;mandText:=edit1.Text;//即sql内容ClientDataSet1.Open;对于没有应用服务器设置filter 如:country like 'A%'filtered=true可实现sql功能(2)有参数如服务端query的sql为select * from animalswhere name like :dd则:客户端ClientDataSetvarpm:Tparam;beginClientDataSet1.Close;ClientDataSet1.ProviderName:='DataSetProvider1';pm:=Tparam.Create(nil);:='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 保存目前为止数据状态,可以恢复到这个状态varpp:integer;beginpp:=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,实现自动容错和负载平衡====================================== ================影响ClientDataSet处理速度的一个因素TClientDataSet是Delphi开发数据库时一个非常好的控件。

相关文档
最新文档