Contents
X3平台分为 客户端 应用服务器 数据库服务器,数据都是存放在数据库服务器,客户端发数据请求到应用服务器,由应用服务器发SQL语句到数据库服务器,获取数据后,返回给客户端。数据在客户端是以数据集的方式来组织和维护的。理解数据集,对于理解客户端编程就非常重要了。
1. 激活数据集
数据集默认处于关闭状态,没有从服务器获取数据,此时数据集中没有数据,当数据集处于打开状态(DataSet.Active=True)时候,才会从服务端获取到需要的数据。
1.1. 相关属性和方法
property Active: Boolean;
判断数据集是否处于打开状态,True为打开状态,False为关闭状态procedure Open;
打开数据集,打开以后,Active属性为Trueprocedure Close;
关闭数据集,关闭以后,Active属性为False
1.2. 激活数据集的方法
DataSet.Active := True;
DataSet.Open;
1.3. 关闭数据集的方法
DataSet.Active := False;
DataSet.Close;
2. 数据集状态
数据集有三种状态:浏览、编辑、新增。数据集打开时候,处于浏览状态,在浏览状态下不可以修改字段的值,只有让数据集处于编辑状态或者新增状态才可以修改字段的值。
2.1. 相关属性和方法
Proerty State: TDataSetState;
数据集状态属性,可以是dsBrowse,dsInsert,dsEditprocedure Append;
增加记录,修改数据集状态为dsInsertprocedure Insert;
增加记录,修改数据集状态为dsInsertprocedure Edit;
编辑当前记录,修改数据集状态为dsEditprocedure Post;
提交修改或者新增的记录,修改数据集状态为dsBrowseprocedure Cancel;
取消修改或者新增的记录,取消上次执行Append或者Edit之后对字段的所有修改,修改数据集状态为dsBrowseprocedure Delete;
删除当前记录,不修改数据集的状态
2.2. 修改字段的值
1 //修改数据集状态,让数据集处于新增状态.
2 DataSet.Edit;
3 //修改字段的值.
4 DataSet.FieldByName('ZD1').AsString := 'test';
5 //确认修改,让数据集回到浏览状态.
6 DataSet.Post;
2.3. 新增一条记录
1 //修改数据集状态,让数据集处于新增状态.
2 DataSet.Append;
3 //对每一个字段赋值.
4 DataSet.FieldByName('ZD1').AsString := 'test';
5 DataSet.FieldByName('ZD2').AsString := 'test';
6 DataSet.FieldByName('ZD3').AsString := 'test';
7 //确认新增,让数据集回到浏览状态.
8 DataSet.Post;
3. 数据集增删改
3.1. 相关属性和方法
procedure Append;
增加记录,修改数据集状态为dsInsertprocedure Insert;
增加记录,修改数据集状态为dsInsertprocedure Edit;
编辑当前记录,修改数据集状态为dsEditprocedure Post;
提交修改或者新增的记录,修改数据集状态为dsBrowseprocedure Cancel;
取消修改或者新增的记录,取消上次执行Append或者Edit之后对字段的所有修改,修改数据集状态为dsBrowseprocedure Delete;
删除当前记录,不修改数据集的状态
4. 数据集的遍历
客户端的数据集一次只能修改一条记录,不能同时修改多条记录。可以被修改的记录是数据集的当前记录,如果需要修改多条记录,就要不断的滚动数据集,让需要修改的记录变成当前记录来修改。
4.1. 相关属性和方法
property Bof: Boolean;
数据集当前记录是否定位到第一条记录property Eof: Boolean;
数据集当前记录是否定位到最后一条记录procedure First;
移动数据集的当前记录到第一条记录procedure Prior;
移动数据集的当前记录到前一条记录procedure Next;
移动数据集的当前记录到后一条记录procedure Last;
移动数据集的当前记录到最后一条记录function MoveBy(Distance: Integer): Integer;
移动数据集的当前记录到相对当前记录Distance的记录
1 //定位到数据集的第一条记录.
2 DataSet.First;
3 while not DataSet.Eof do
4 begin
5 DataSet.Edit;
6 //修改字段的值.
7 DataSet.FieldByName('ZD1').AsString := 'test';
8 DataSet.Post;
9 //滚动到下一条记录.
10 DataSet.Next;
11 end;
5. 更新数据集
5.1. 相关属性和方法
property Bof: Boolean;
数据集当前记录是否定位到第一条记录procedure CancelUpdates;
取消本地数据集的修改,不提交给服务端function ApplyUpdates(MaxErrors: Integer); Integer;
把本地数据集的修改提交给应用服务端procedure ApplyUpdates;
把本地数据集的修改提交给应用服务端procedure ApplyUpdates(Cascade: Boolean);
把本地数据集的修改提交给应用服务端
以上给出的方法都是修改本地数据集的数据,并没有把修改提交给服务端,提交给服务端,需要调用DataSet.ApplyUpdates。
1 //定位到数据集的第一条记录.
2 DataSet.First;
3 while not DataSet.Eof do
4 begin
5 DataSet.Edit;
6 //修改字段的值.
7 DataSet.FieldByName('ZD1').AsString := 'test';
8 DataSet.Post;
9 //滚动到下一条记录.
10 DataSet.Next;
11 end;
12 //提交修改到服务端.
13 DataSet.ApplyUpdates;
6. 性能考虑
数据集的每一次滚动或者修改都会通知关联的控件,以做显示表现数据的变化,如果有遍历数据集等大量的数据集动作,需要在之前调用DisableControls方法让数据感知控件不作变化,只有当执行EnableControls之后才体现数据集的变化。
有批量数据修改时,批量的在客户端修改数据,最后统一调用一次ApplyUpdates来提交给服务器,而不要每一条记录修改都提交。
6.1. 相关属性和方法
procedure DisableControls;
断开数据感知控件与数据集的关联procedure EnableControls;
建立数据感知控件与数据集的关联
1 DataSet.DisableControls;
2 try
3 //定位到数据集的第一条记录.
4 DataSet.First;
5 while not DataSet.Eof do
6 begin
7 DataSet.Edit;
8 //修改字段的值.
9 DataSet.FieldByName('ZD1').AsString := 'test';
10 DataSet.Post;
11 //滚动到下一条记录.
12 DataSet.Next;
13 end;
14 //提交修改到服务端.
15 DataSet.ApplyUpdates;
16 finally
17 DataSet.EnableControls;
18 end;