clientdataset 做为 单机数据库的 使用 学习
http://blog.csdn.net/waveyang/article/details/34146737
unit Unit3;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids,
Data.DB, Datasnap.DBClient;
type
TForm3 = class(TForm)
Button1: TButton;
Button2: TButton;
DataSource1: TDataSource;
ClientDataSet1: TClientDataSet;
DBGrid1: TDBGrid;
ClientDataSet1id: TIntegerField;
ClientDataSet1qishu: TIntegerField;
ClientDataSet1kaijiang: TIntegerField;
ClientDataSet1shijian: TStringField;
ClientDataSet1beizhu: TStringField;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
var
Path: string;
begin
Path := ExtractFilePath(Application.ExeName); //取得可执行文件路径
self.ClientDataSet1.FileName := Path + 'test.cds';
self.ClientDataSet1.LoadFromFile(Path + 'test.cds');
self.ClientDataSet1.Open;
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
self.ClientDataSet1.InsertRecord([111,2,3,'aaaaa','cccc']);
end;
procedure TForm3.Button3Click(Sender: TObject);
var a,b,c:string; i,j,k:integer;
begin
self.ClientDataSet1.First;
i:=self.ClientDataSet1.FieldValues['id'] ;
showmessage(inttostr(i));
end;
end.
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)有参数
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,实现自动容错和负载平衡。
clientdataset 做为 单机数据库的 使用 学习的更多相关文章
- Xamarin android使用Sqlite做本地存储数据库
android使用Sqlite做本地存储非常常见(打个比方就像是浏览器要做本地存储使用LocalStorage,貌似不是很恰当,大概就是这个意思). SQLite 是一个软件库,实现了自给自足的.无服 ...
- CentOS 7.1静默安装11.2.0.3 64位单机数据库软件
第1章 CentOS 7.1静默安装11.2.0.3 64位单机数据库软件 1.1 安装前的准备工作 1.1.1 软件准备 1.1.2 检查硬件 注意这里的内存应该满足要求,不然 ...
- Redis中单机数据库的实现
1. 内存操作层 zmalloc 系接口 redis为了优化内存操作, 封装了一层内存操作接口. 默认情况下, 其底层实现就是最简朴的libc中的malloc系列接口. 如果有定制化需求, 可以通过配 ...
- 单机数据库优化的一些实践(mysql)
数据库优化有很多可以讲,按照支撑的数据量来分可以分为两个阶段:单机数据库和分库分表,前者一般可以支撑500W或者10G以内的数据,超过这个值则需要考虑分库分表.另外,一般大企业面试往往会从单机数据库问 ...
- 数据库中间件MyCat学习总结(1)——MyCat入门简介
为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代.如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷. MyCat的目标就是:低成本 ...
- 数据库中间件DBLE学习(二) 学习配置schema.xml
前言 一边有一个经常引诱我让我"娱乐至死"的视频,还有一个不停"鞭策"我让我快点学习的大BOSS.正是有这两种极端的爱才让我常常在自信中明白自己努力的方向.嗯, ...
- Redis(二):单机数据库的实现
概要 本部分内容主要是研究单机数据库.分别介绍单机数据库的实现原理,数据库的持久化,Redis事件,服务器维护管理客户端以及单机服务器的运作机制. 数据库 数据库结构 Redis数据库由redis.h ...
- Flas-SQLAchemy数据库操作使用学习笔记
Flas-SQLAchemy数据库操作使用学习笔记 Flask-SQLALchemy 是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展.SQLALchemy 是Python语言的S ...
- 集群中节点(Node)与单机数据库的区别
集群中节点(Node)与单机数据库的区别: 区别项 集群中节点(Node) 单机数据库 只能使用0号数据库 是 都可以使用
随机推荐
- 前端开发HTML&css入门——伪类选择器和一些特殊的选择器
伪类和伪元素 有时候,你需要选择本身没有标签,但是仍然易于识别的网页部位,比如段落首行或鼠标滑过的连接.CSS为他们提供一些选择器:伪类和伪元素. 常用的一些伪类选择器: :link :visited ...
- git上传代码到code.csdn.net出错
用git push代码到csdn code的时候出现错误 error:failed to push some refs to - Dealing with "non-fast-forward ...
- R语言模型选择之精度准则与最大值法问题
在模型选择中我们一般用caret包train函数建立模型,并对模型进行评判 方法1: ) tr_control<-trainControl(method = ) # 创建随机森林模型 model ...
- 判断是否是iframe框架打开登录页, iframe框架着顶部页面刷新
if (window != top) top.location.href = location.href;
- Codeforces 918 括号匹配 SGdp[i][j][k]
A B C #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) ...
- 10年前文章_ vi编辑器查找与替换方法
vi编辑器查找与替换方法1.查找:/ 当前行往下找:? 当前行往上找找到后继续查找同方向 n反方向 N2.替换格式: range s/source/target/g解释:range表示要搜索的范围 & ...
- 去掉windows換行符^M
在命令模式下运行命令 :%s/^M//g 回车注意:里面的^M 必须是同时按 Ctrl+V+M ,表示回车.不是直接输入 ^M,也不是粘帖复制.命令完成后,用:x 保存退出后,再次用vi打开就全部被替 ...
- GUI学习之三十三——QProgressBar学习总结
今天总结的是QProgressBar的使用方法 一.描述 提供了一个水平或垂直的进度条,用于向用户提供操作进度的指示,用户也可以从进度条看出来程序是否正在运行. 二.功能作用 1.设置范围和当前值 Q ...
- GUI学习之二十一——QSlider、QScroll、QDial学习总结
上一章我们学习了QAbstractSlider的用法,在讲功能的时候我们是借助了它的子类QSlider来实现的,今天来学习一下它的三个子类——QSlider.QScroll和QDial. 一.QSli ...
- pandas处理字符串
# pandas 字符串的处理 # 前面已经学习了字符串的处理函数 # df["bWendu"].str.replace("℃","").a ...