在Delphi中利用Tbatch组件完成数据批处理在数据库应用系统中,常常要对数据进行成批的如追加、删除、更改等操作,这种批量操作在专门的数据库开发工具如VFP中用APPEND、COPY命令带上相应的命令子句就能轻易完成。但在其它开发工具中并没有类似的命令,而是提供能完成类似功能的控件或对象,如在PowerBuilder中就是利用PipeLine(数据管道)来完成两个或同构或不同构的表之间的数据批处理。本文要介绍的是Delphi中用来完成数据批处理任务的组件TBatchMove。TBatchMove组件能够:将一个数据集中的数据追加到一个表中。.
从一个表中删除满足条件的记录。
按旧表结构生成一个新表,若欲生成的新表已存在,则覆盖。----具体的操作要通过设置TBatchMove的Mode属性后再调用Execute方法来完成。为举例说明问题,我们在别名数据库DBDEMOS中先创建两个dBase格式的表Test1.dbf和Test2.dbf。二者的结构如下表:
Test1.dbf Test2.dbf
Name C 10 Name C 10
Code C 3 Code C 3
----其中表Test2.dbf在字段code上建立有唯一索引。同时假设表单中已有两个TABLE控件Tsource和Tdest和一个TbatchMove组件batchmove1。Tsource和Tdest的DatabaseName属性均设为DBDEMOS。batchmove1的source属性设为Tsource,destination属性设为Tdest。
----在使用TbatchMove组件时,必须牢记:所有的操作都是以源表为标准针对目的表进行的,下面就分别举例说明TbatchMove的各种操作模式:batAppend追加模式将源表中的数据追加到目的表中,目的表必须事先存在。这是缺省模式。
batchmove1.source=Tsource;
batchmove1.destination=Tdest2;
batchmove1.Mode:=batCopy;
batchmove1.Execute;batUpdate更新模式用源表中匹配目的表的记录替换目的表中的相应记录。目的表必须事先存在且有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batUpdate;
batchmove1.Execute;batAppendUpdate追加更新模式如果源表中有与目的表匹配的记录,则替换目的表记录,否则,直接追加到目的表中。目的表必须事先存在且有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batAppendUpdate;
batchmove1.Execute;batCopy拷贝模式按源表结构生成新表,源表中的数据同时拷贝到目的新表中。如果要生成的新表已存在,则覆盖。
//按Test1.dbf生成新表xxx.dbf
//如果不指定扩展名dbf,生成的新表将是Paradox格式的xxx.db。
Tdest.TableName:='xxx.dbf';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batCopy;
batchmove1.Execute;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中查看到。
从一个表中删除满足条件的记录。
按旧表结构生成一个新表,若欲生成的新表已存在,则覆盖。----具体的操作要通过设置TBatchMove的Mode属性后再调用Execute方法来完成。为举例说明问题,我们在别名数据库DBDEMOS中先创建两个dBase格式的表Test1.dbf和Test2.dbf。二者的结构如下表:
Test1.dbf Test2.dbf
Name C 10 Name C 10
Code C 3 Code C 3
----其中表Test2.dbf在字段code上建立有唯一索引。同时假设表单中已有两个TABLE控件Tsource和Tdest和一个TbatchMove组件batchmove1。Tsource和Tdest的DatabaseName属性均设为DBDEMOS。batchmove1的source属性设为Tsource,destination属性设为Tdest。
----在使用TbatchMove组件时,必须牢记:所有的操作都是以源表为标准针对目的表进行的,下面就分别举例说明TbatchMove的各种操作模式:batAppend追加模式将源表中的数据追加到目的表中,目的表必须事先存在。这是缺省模式。
batchmove1.source=Tsource;
batchmove1.destination=Tdest2;
batchmove1.Mode:=batCopy;
batchmove1.Execute;batUpdate更新模式用源表中匹配目的表的记录替换目的表中的相应记录。目的表必须事先存在且有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batUpdate;
batchmove1.Execute;batAppendUpdate追加更新模式如果源表中有与目的表匹配的记录,则替换目的表记录,否则,直接追加到目的表中。目的表必须事先存在且有一已定义的索引用来匹配源表中的记录。
Tdest.IndexFieldNames:='code';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batAppendUpdate;
batchmove1.Execute;batCopy拷贝模式按源表结构生成新表,源表中的数据同时拷贝到目的新表中。如果要生成的新表已存在,则覆盖。
//按Test1.dbf生成新表xxx.dbf
//如果不指定扩展名dbf,生成的新表将是Paradox格式的xxx.db。
Tdest.TableName:='xxx.dbf';
batchmove1.source=Tsource;
batchmove1.destination=Tdest;
batchmove1.Mode:=batCopy;
batchmove1.Execute;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中查看到。
解决方案 »
- TNativeXml使用的一个小问题,修改某一个值
- 怎样向clientdataset动态建立字段
- ACCESS奇怪问题
- dbgrideh导入excel提示TDBGridEhExportClass未定义
- 如何控制任务栏窗口按钮
- winsock改为非广播,应该怎么修改
- 怎么判断系统中是不是安转了一个word2000这个程序
- 怎樣控制Teechart顯示時放大和縮小﹖
- 再次贴贴
- delphi5自带的interbase5.5数据库的安装序列号是多少?请各位帮忙!!!谢谢!
- 上次有个朋友问过的(我找不到):“Query中的DataSource属性的用法”
- c/s的客户端程序如何通过scoks代理进行连接?
谁给个具体的 过程,鞠躬了
oracle中建立一个存储过程。
程序调用
每调用一次写的记录数可以用程序来控制。测试了很久,一次添加10条记录,速度比较快。这样每秒可以写200条左右
Report Builder中的数据管道控件很不错,去下一个吧。
[email protected]
數據庫內部運作.要導入大是大量的數據, 你得要暫時停止使用Oracle的事務事宜,如'redo log',
或暫停核對數據限制等等. Oracle有幾種導入導出的方法, 甚至直接讀取
數據備份文件, 而繞過數據庫系統部份.
你可到Oracle那邊看看吧.
使用openrowset就行了.oracle没用过.
怎么导入呀,请帮一下我呀
====================================================================
用于 Jet 的 Microsoft OLE DB 提供程序可用于访问并查询文本文件。 若要直接创建访问文本文件的链接服务器而不将文件链接为 Access .mdb 文件中的表,请执行 sp_addlinkedserver,如下例所示。
提供程序是 Microsoft.Jet.OLEDB.4.0,提供程序字符串为"Text"。数据源是包含文本文件的目录的完整路径名称。schema.ini 文件(描述文本文件的结构)必须与此文本文件存在于相同的目录中。有关创建 schema.ini 文件的更多信息,请参见 Jet 数据库引擎文档。--Create a linked server.
EXEC sp_addlinkedserver txtsrv, 'Jet 4.0',
'Microsoft.Jet.OLEDB.4.0',
'c:\data\distqry',
NULL,
'Text'
GO--Set up login mappings.
EXEC sp_addlinkedsrvlogin txtsrv, FALSE, NULL, Admin, NULL
GO--List the tables in the linked server.
EXEC sp_tables_ex txtsrv
GO--Query one of the tables: file1#txt
--using a 4-part name.
SELECT *
FROM txtsrv...[file1#txt] into yourtable
var
fText:TextFile;
fSQL:TextFile;
strLine:String;
iCount:Integer;
begin
AssignFile(fSQL,'E:\Test\Import.sql');
Rewrite(fSQL);
AssignFile(fText,'E:\Test\Test.txt');
Reset(fText);
while not Eof(fText) do
begin
readln(fText,strLine);
strLine:=Trim(strLine);
for iCount:=1 to Length(strLine) do
begin
if (' '=strLine[iCount])or(#9=strLine[iCount]) then
begin
break;
end;
end;
writeln(fSQL,'insert into test values("'+Copy(strLine,1,iCount-1)+'","'+Trim(Copy(strLine,iCount,Length(strLine)))+'");');
end;
CloseFile(fText);
CloseFile(fSQL);
end;