在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中查看到。

解决方案 »

  1.   

    原始数据在文本文件中,怎么batchmove
    谁给个具体的 过程,鞠躬了
      

  2.   

    大哥,为什么不使用Oralce提供的工具SQLLoader操作呢?
      

  3.   

    如果没有要求使用Delphi解决,微软的DTS更简单,而且使全中文的!!!!
      

  4.   

    类似的事情目前我正在做
    oracle中建立一个存储过程。
    程序调用
    每调用一次写的记录数可以用程序来控制。测试了很久,一次添加10条记录,速度比较快。这样每秒可以写200条左右
      

  5.   

    ppTextPipeline+tBatchMove可以实现
    Report Builder中的数据管道控件很不错,去下一个吧。
      

  6.   

    把那个文本发过来,今天帮你搞这!OK!
    [email protected]
      

  7.   

    Delphi只會做前端應用軟件, 好像BDE, DBExpress等都不可以更改Oracle
    數據庫內部運作.要導入大是大量的數據, 你得要暫時停止使用Oracle的事務事宜,如'redo log',
    或暫停核對數據限制等等.  Oracle有幾種導入導出的方法, 甚至直接讀取
    數據備份文件, 而繞過數據庫系統部份.  
    你可到Oracle那邊看看吧.
      

  8.   

    使用SQL Loader吧!我处理500万条记录(文本的,300M)只需要5分钟!!!没办法,我们国家的计算机水平比较落后,国家机关之间的数据传递还是用文本文件,我上个月就在帮他们处理从文本文件到数据库的工作!!!
      

  9.   

    要用delphi应用程序控制, 导入在本机定时(10分钟)生成的文本文件 到远程oracle数据库的一个空表中
      

  10.   

    呵呵,我知道SQL server下如何导入...
    使用openrowset就行了.oracle没用过.
      

  11.   

    to  Mudeen(笑哥哥) 
     怎么导入呀,请帮一下我呀
      

  12.   

    必须用DELPHI写的程序中导入吗?如果仅仅是用作日后使用则可以根据文本中数据格式的规律自己写个程序(什么语言都行),生成ORACLE的sql文件(包含众多的诸如insert ... into ...的语句的文件),在ORACLE中直接执行,快当得多,我以前干过。
      

  13.   

    写个工具软件直接将文本转换成ORACLE的SQL文件(包含20万条INSERT语句),在PLUS下直接执行岂不省事。
      

  14.   

    这是SQL server的例子.我用过openrowset从access中批量导入到SQL server中.1000条记录很快就完成了.不知道在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
      

  15.   

    procedure GenerateSQLFile;
    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;