Batchmove控件的详细用法(100分)

  • 主题发起人 主题发起人 lt
  • 开始时间 开始时间
L

lt

Unregistered / Unconfirmed
GUEST, unregistred user!
我需要在几个物理位置不同,结构相同的数据库中用软盘实现COPY数据,许多人建议我有BATCHMOVE控件,但我对它一无所知,烦请各位大虾详细讲解一下,斗胆请求最好能根据我的情况举个例子,下面是拙作的说明:

WIN98,DELPHI3.0C/S
PARADOX数据库,每个数据库中只有一个表,
 
以前用过这个东东,刚才又看了一下,虽然帮助一大堆,但好多不用关它。
先给你说一下,在Delphi4中,目录Delphi4/help/examples/Batchmv下有一个
例子程序,你可以看一看,对了,你的是Delphi3,想来也应该有吧,没有再找找
Demos目录下有没有。

这个控件的主要属性如下:
Source 在这里指定源数据集的名字,就是Table或Query的名字;
Destination 显然是目标数据集的名字了;

Mappings 是一个TStrings的属性,每一行表示一个字段之间的对应,如果源数据
集与目标数据集的字段名相同,不用关它,控件会自动匹配。如果要写,格式是
目标列名=源列名(等号两边不要有空格)

Mode 相当于个参数了,控制如何进行BatchMove,对于你的来说应该是用batAppend
了,如果有其他目的,换换其他参数,一共五种,基本上一看便知,再不行看看help.

AbortOnKeyViol与AbortOnProblem 是说明在复制数据时,目标数据集发生关键字冲
突或其他问题(如类型不匹配,特别是长字符串字段对应短字符串字段)。

如果以上两个参数是False,可以使用ProblemTableName指定一个表来存储有问题的
记录

ChangedTableName 则用来存储由于字段类型不匹配造成的记录数据修改的记录。

以上两个属性可以不设。

MovedCount 只读属性,表示成功复制的记录数

ProblemCount 只读属性,表示有问题的记录数

还有ChangedCount,KeyViolCount顾名思义。

其他还有属性不大用的着。

最主要是要设定好Source和Destination,需要的话还有Mappings,以及mode就成了

设置好属性后,执行方法Execute就Ok.

针对你的问题,我建议你如下:
1. Destination 指定为要输入备分的table名
2. Source 则轮换着将几个不同位置的表换一边,实际上,这里可能不许要你动,只
用你执行完一次之后,关闭相连的Table或Query,更改DatabaseName 和
TableName 或SQL语句,再打开即可。
其他的错误处理看你的选择了,最简单的就是忽略所有冲突与问题。

至于用软盘实现数据拷贝,当然可以先自己创建个新表,作为Destination了。然后
将这些文件拷贝到软盘中。

还有其他的控件可以用来将数据表中的数据备份到一个外部文件中,自己也可以写一
个,要自己定义文件格式,有点麻烦了。










 
上面说的很完整,我就不多说了。
 
我认为用BATCHMOVE来做数据的COPY不是很合适,因为BATCHMOVE的Source和
Destination是基于BDE配置的DATASET,你如果配置一个BDE的ALIAS指向软盘,
可能在程序的控制(指打开TTABLE或TQUERY)上增加难度,况且BATCHMOVE也不是
为数据COPY而设计,用它太牵强.数据COPY的办法可以用SAVEAS等METHORD存到
软盘上.
 
用SQL的insert试试,前几天我也遇到类似的问题,后来用她解决了。
query1.close;
query1.sql.clear;
query1.sql.add('insert into "数据库名" select * from "源库名"');
query1.execsql;
query1.close;
试一下,是不是很爽?

 
小咪,如果lt用的是paradox表的话,数据库别名实际上是不用设定的,直接写入
表所在的目录即可,例如是A盘跟目录的话,直接写"
Table.DatabaseName := 'A:/';

tomye的方法倒不失是一个方法,但没有错误处理机制,如果遇到错误的话(如关键字
重复)就down了.
 
用BatchMove复制本地表是最快的。
 
多人接受答案了。
 
后退
顶部