I
import
Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi中利用Tbatch组件完成数据批处理 整理编辑:ChinaASP
在数据库应用系统中,常常要对数据进行成批的如追加、删除、更改等操作,这种批量操作在专门的数据库开发工具如VFP中用APPEND、COPY命令带上相应的命令子句就能轻易完成。但在其它开发工具中并没有类似的命令,而是提供能完成类似功能的控件或对象,如在PowerBuilder中就是利用PipeLine(数据管道)来完成两个或同构或不同构的表之间的数据批处理。本文要介绍的是Delphi中用来完成数据批处理任务的组件TBatchMove。TBatchMove组件能够:
(1)将一个数据集中的数据追加到一个表中。.
(2)从一个表中删除满足条件的记录。
(3)按旧表结构生成一个新表,若欲生成的新表已存在,则覆盖。
具体的操作要通过设置TBatchMove的Mode属性后再调用Execute方法来完成。为举例说明问题,我们在别名数据库DBDEMOS中先创建两个dBase格式的表Test1.dbf和Test2.dbf。二者的结构如下表:
Test1.dbfTest2.dbf
NameC10NameC10
CodeC3CodeC3
其中表Test2.dbf在字段code上建立有唯一索引。同时假设表单中已有两个TABLE控件Tsource和Tdest和一个TbatchMove组件batchmove1。Tsource和Tdest的DatabaseName属性均设为DBDEMOS。batchmove1的source属性设为Tsource,destination属性设为Tdest。
在使用TbatchMove组件时,必须牢记:所有的操作都是以源表为标准针对目的表进行的,下面就分别举例说明TbatchMove的各种操作模式:
(1)batAppend追加模式将源表中的数据追加到目的表中,目的表必须事先存在。这是缺省模式。
batchmove1.source=Tsource;
batchmove1.destination=Tdest2;
batchmove1.Mode:=batAppend;
batchmove1.Execute;
(2)batUpdate更新模式用源表中匹配目的表的记录替换目的表中的相应记录。目的表必须事先存在且有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batUpdate;
batchmove1.Execute;
(3)batAppendUpdate追加更新模式如果源表中有与目的表匹配的记录,则替换目的表记录,否则,直接追加到目的表中。目的表必须事先存在且有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batAppendUpdate;
batchmove1.Execute;
(4)batCopy拷贝模式按源表结构生成新表,源表中的数据同时拷贝到目的新表中。如果要生成的新表已存在,则覆盖。
//按Test1.dbf生成新表xxx.dbf
//如果不指定扩展名dbf,生成的新表将是Paradox格式的xxx.db。
Tdest.TableName:='xxx.dbf';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batCopy;
batchmove1.Execute;
(5)batDelete删除模式删除目的表中与源表匹配的记录。目的表必须事先存在且有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batDelete;
batchmove1.Execute;
TBatchMove还有一个重要属性ChangedTableName,在实际运用中,通过指定ChangedTableName属性可以创建一个Paradox表,该表用来保存目的表中被更改数据的原始备份,有了这个备份表就可以确保恢复目的表中的数据。
顺便提一句,如果要删除某一个表中的全部记录,可以采用Table组件的EmptyTable方法,例如Tdest.EmptyTable将清空Tdest所指定的表test2.dbf。
本文中是以同构的dbf表进行的示例,在实际运用中,源表和目的表可能同购,也可能异构,异构时,Delphi的BDE会自动进行类型和长度上的转换,具体类型间的关系可以有关BDE的帮助。本文中各种操作模式的实际结果均可以从Delphi的DatabaseDesktop中查看到。
在数据库应用系统中,常常要对数据进行成批的如追加、删除、更改等操作,这种批量操作在专门的数据库开发工具如VFP中用APPEND、COPY命令带上相应的命令子句就能轻易完成。但在其它开发工具中并没有类似的命令,而是提供能完成类似功能的控件或对象,如在PowerBuilder中就是利用PipeLine(数据管道)来完成两个或同构或不同构的表之间的数据批处理。本文要介绍的是Delphi中用来完成数据批处理任务的组件TBatchMove。TBatchMove组件能够:
(1)将一个数据集中的数据追加到一个表中。.
(2)从一个表中删除满足条件的记录。
(3)按旧表结构生成一个新表,若欲生成的新表已存在,则覆盖。
具体的操作要通过设置TBatchMove的Mode属性后再调用Execute方法来完成。为举例说明问题,我们在别名数据库DBDEMOS中先创建两个dBase格式的表Test1.dbf和Test2.dbf。二者的结构如下表:
Test1.dbfTest2.dbf
NameC10NameC10
CodeC3CodeC3
其中表Test2.dbf在字段code上建立有唯一索引。同时假设表单中已有两个TABLE控件Tsource和Tdest和一个TbatchMove组件batchmove1。Tsource和Tdest的DatabaseName属性均设为DBDEMOS。batchmove1的source属性设为Tsource,destination属性设为Tdest。
在使用TbatchMove组件时,必须牢记:所有的操作都是以源表为标准针对目的表进行的,下面就分别举例说明TbatchMove的各种操作模式:
(1)batAppend追加模式将源表中的数据追加到目的表中,目的表必须事先存在。这是缺省模式。
batchmove1.source=Tsource;
batchmove1.destination=Tdest2;
batchmove1.Mode:=batAppend;
batchmove1.Execute;
(2)batUpdate更新模式用源表中匹配目的表的记录替换目的表中的相应记录。目的表必须事先存在且有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batUpdate;
batchmove1.Execute;
(3)batAppendUpdate追加更新模式如果源表中有与目的表匹配的记录,则替换目的表记录,否则,直接追加到目的表中。目的表必须事先存在且有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batAppendUpdate;
batchmove1.Execute;
(4)batCopy拷贝模式按源表结构生成新表,源表中的数据同时拷贝到目的新表中。如果要生成的新表已存在,则覆盖。
//按Test1.dbf生成新表xxx.dbf
//如果不指定扩展名dbf,生成的新表将是Paradox格式的xxx.db。
Tdest.TableName:='xxx.dbf';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batCopy;
batchmove1.Execute;
(5)batDelete删除模式删除目的表中与源表匹配的记录。目的表必须事先存在且有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batDelete;
batchmove1.Execute;
TBatchMove还有一个重要属性ChangedTableName,在实际运用中,通过指定ChangedTableName属性可以创建一个Paradox表,该表用来保存目的表中被更改数据的原始备份,有了这个备份表就可以确保恢复目的表中的数据。
顺便提一句,如果要删除某一个表中的全部记录,可以采用Table组件的EmptyTable方法,例如Tdest.EmptyTable将清空Tdest所指定的表test2.dbf。
本文中是以同构的dbf表进行的示例,在实际运用中,源表和目的表可能同购,也可能异构,异构时,Delphi的BDE会自动进行类型和长度上的转换,具体类型间的关系可以有关BDE的帮助。本文中各种操作模式的实际结果均可以从Delphi的DatabaseDesktop中查看到。