TTable构件的BatchMove函数能够从其他表中引入数据,包括复制、添加、修改或删除记录,并返回被操作的记录数。BatchMove函数需要传递两个参数,一个是源数据集的名称,另一个是操作方式。BatchMove函数支持以下操作方式:
l batAppend把源表中的所有记录复制到目标表的末尾;
l batUpdate用源表中的记录更新目标表中的记录;
l batAppendUpdate把源表中不存在于目标表中的记录添加在目标表的末尾;
l batDelete删除源表在目标表中重复的记录;
l batCopy把源表复制到目标表。
下面的代码用Customer表中的记录更新当前表中的记录:
Table1.BatchMove('CUSTOMER.DB', batUpdate);与TBatchMove构件相比,BatchMove函数的功能比较简单。如果要移动很多的记录,最好选用TBatchMove构件。TBatchMove构件封装了一部分BDE的功能,能够从另一个数据集中引入数据。TBatchMove构件经常用于从服务器下载数据或者把本地的数据上载到服务器。TBatchMove构件能够自动建立一个新的表,并映射源数据集中的字段名称和类型。
使用TBatchMove构件的一般步骤
第一步,把一个TTable构件或TQuery构件放到窗体或数据模块上作为源数据集。
第二步,把另一个TTable构件放到窗体或数据模块上作为目标数据集。
第三步,把一个TBatchMove 构件放到数据模块上,设置它的Source属性指定源数据集,设置它的Destination属性指定目标数据集。
第四步,设置Mode属性指定操作方式,可以设为batAppend、batUpdate、batAppendUpdate、batCopy、batDelete等。
第五步(可选),设置ProblemTableName属性指定一个表的名字,执行批量移动操作时有问题的记录将放到这个表中。设置KeyViolTableName属性指定一个表的名字,更新一个Paradox表时违反主索引定义的记录将放到这个表中。设置ChangedTableName 属性指定一个表的名字,执行批量移动操作时目标表中变动的记录将放到这个表中。
第六步(可选),设置Mappings属性指定字段的映射方式。
第七步,调用Execute执行批量移动操作。指定操作方式TBatchMove构件的Mode属性用于指定操作方式:
l batAppend把源表中的所有记录复制到目标表的末尾;
l batUpdate用源表中的记录更新目标表中的记录;
l batAppendUpdate把源表中不存在于目标表中的记录添加在目标表的末尾;
l batDelete删除源表在目标表中重复的记录;
l batCopy把源表复制到目标表。
对于batAppend方式来说,目标数据集必须是已存在的。如果需要的话,BDE会自动进行数据类型的转换,不过,转换并不总是能成功的。对于batUpdate方式来说,目标数据集必须是已存在的,并且必须已建立索引。TBatchMove构件根据关键字段用源数据集中的记录更新目标数据集中匹配的记录。在更新过程中,BDE会尽可能地转换数据类型。对于batAppendUpdate方式来说,目标数据集必须是已存在的,并且必须已建立索引。TBatchMove构件根据关键字段用源数据集中的记录更新目标数据集中匹配的记录,如果没有找到匹配的记录,TBatchMove构件就把记录添加在源数据集的末尾。对于batCopy方式来说,目标数据集最好是不存在的,如果已经存在,目标数据集中的记录会被源数据集中的记录覆盖。如果源数据集和目标数据集的结构不同,例如,一个是Paradox,另一个是InterBase,BDE会尽可能地转换。不过,TBatchMove构件不会复制源数据集的索引、纠错规则、存储过程。对于batDelete方式来说,目标数据集必须是已存在的,并且必须已建立索引。TBatchMove构件根据关键字段删除目标数据集中重复的记录,
映射字段类型
默认情况下,在源数据集和目标数据集之间批量移动记录时是以字段的位置匹配的,也就是说,源数据集中的第一个字段到目标数据集中仍然是第一个字段,依次类推。如果不希望按字段的位置匹配,而希望按字段的名称匹配,就要设置Mappings属性。Mappings属性是一个字符串列表。假设源数据集中有一个字段叫SourceColName,希望它在目标数据集中匹配DestColName字段,Mapping属性中应加入这么一行:DestColName = SourceColName程序示例如下:
Procedure TForm1.Button1Click(Sender: TObject);
var Maps: TStringList;
Begin
With Maps Do
Begin
    Clear;
    Add('CustNo=CustomerNum');
    Add('SSN');
End;
BatchMove1.Mappings := Maps;
End;
如果等号两边的字段的数据类型不同,Delphi 4会尽可能地转换,但可能会丢失数据或精度。假设一个字段是CHAR(10),如果试图转换为CHAR(5),后5个字符将被截掉。8.9.4 执行批量移动操作调用Execute函数将执行批量移动操作。例如,假设BatchMoveAdd是TBatchMove 构件的名称,要执行批量移动操作,可以这样写:
BatchMoveAdd.Execute;
实际上,在设计期也可以执行批量移动操作,方法是:在TBatchMove 构件上单击鼠标右键,在弹出的菜单中选择“Execute”命令。调用了Execute后,可以访问MovedCount属性,查看实际移动了多少条记录。RecordCount属性用于限制每次批量移动的记录数。如果RecordCount属性设为0,表示没有限制。