我用BDE的连接方式,从服务器的ORACLE数据库中读取记录集,然后再插入本机中的Paradox数据库中。
由于字段结构不完全一样,所以需要逐个字段赋值。当查询结果有上万条纪录时,插入速度就奇慢。我计算了一下:二十多个表总共不到20万条纪录的转移竟要1个小时,太不正常了吧。
我用的语句是://从服务器中oracle旧表中取数据
 with qryOld do
            begin
                close;
                sql.clear;
                sql.Add('select id1,id2 from table1');
                open;
            end;
//先清空本机中的paradox新表
with qryNew do
            begin
                close;
                sql.clear;
                sql.Add(' delete from table1');
                execsql;
            end; 
//插入数据  
 with qryNew do
         begin
             while(not qryOld.Eof) do
                    begin
                    close;
                    sql.Clear ;
                    Sql.Add('insert into table1');
                    Sql.Add('(id1,id2)');
                    Sql.Add('values');
                    Sql.Add('(:id1,:id2)');
        ParamByName('id1').AsString:=qryOld.FieldByName('id1').AsString;
        ParamByName('id2').AsString:=qryOld.FieldByName('id2').AsString;                    execSql;
                    qryOld.Next ;
                    end;
            end;
大体就是这个模式。还有就是有些字段类型我用了强制转换。不知道速度慢的原因是什么,如何解决呢?

解决方案 »

  1.   

    在終端上処理不過如此了。要麽从Oracle一次取出几千条,暫放入内存、再移入Paradox、
    毎次只取一条送一条、接続数据库需要化费時間。
      

  2.   

    query的一条SQL语句可以同时打开不同数据库的表。
    Paradox表可以直接用文件名来打开,只要在文件名上加双引号就好,这样就可以直接用insert into table1 select id1, id2 from table2
      

  3.   

    不要用BDE,在有大量数据要传输时应最好使用dbExpress。
    因为DataSnap的原因,内存管理比BDE有效率。
      

  4.   


     with qryNew do
             begin
                 close;
                        sql.Clear ;
                        Sql.Add('insert into table1');
                        Sql.Add('(id1,id2)');
                        Sql.Add('values');
                        Sql.Add('(:id1,:id2)');
                 while(not qryOld.Eof) do
                        begin
                        
            ParamByName('id1').AsString:=qryOld.FieldByName('id1').AsString;
            ParamByName('id2').AsString:=qryOld.FieldByName('id2').AsString;                    execSql;
                        qryOld.Next ;
                        end;
                end;这样会快些,减少了开关数据库的时间,试试看
      

  5.   

    建议改用Ado来操作能更快一些。
    利用 TOP 记录数 来实现,不需要的记录就不用读取了,速度相当快了。
      

  6.   

    用SQL语句,不用把数据从服务端读下来..
    批量追加语句..我记不得语法了..
    insert into Table4(编号,序号,姓名)//添加的字段必须跟下面SELECT语句出现的字段相同..select 编号,序号,姓名 from table2不好意思语法记得不是很清...^_^..
      

  7.   

    先谢谢各位!
    to  SaKura2003(小飞仔) , fenglaile(风清飘):方法试了,效果不明显;
    to   xdf221(xdf221) ,shun3(天使鬼差):
       由于 新旧表的结构字段名不完全一样,又不在一台机子上,所以不能这么用的;
    to   xw0071(xx) :我想先优先考虑用BDE,实在不行再用dbExpress;to  ailibuli(愛理不理) ,tryanother() ,welllove88(寒林) :能否说的详细一点啊?
      

  8.   

    TO:楼主   字段名不完全一样,也可以用...
     
       insert into Table4(编号,序号,姓名)
    //添加的字段必须跟下面SELECT语句出现的字段相同..只要有对应就可以,名称可以不一样..select 编号,序号,姓名 from table2
      

  9.   

    呵呵,谢谢 shun3(天使鬼差)!
    我明白你的意思,如果是同一个库内两个字段结构相差无几的表之间导数据,你的方法很好!但是我现在是有的字段旧表没有而新表有,所以我要对它赋值;还有就是新库和旧库是在两台机器上,所以我想不能用吧。
      

  10.   

    楼主的代码明显有问题,你是这样操作的:
    1,将Oracle的一个表的数据读到本地数据集
    2,启动一个循环,用语句一次追加一条记录到Paradox数据表。我建议在第2步的操作改成下列方法:
    创建一个数据集对象,打开这个Paradox表,将Oracle的记录先全部追加到该数据集,然后一次性更新到实际表中,也就是
    由oracle-->paradox  改成oracle-->DataSet(内存中)-->paradox
      

  11.   

    to  truexf(小方) :能否说的详细点?
    我现在是:旧库中A表5个字段,转入新库B表中,但是B表6个字段,第六个字段需要我自己赋值,不知能否用你的方法。
      

  12.   

    以下,是我的一个代码示例,由于我对BDE熟,所以相关函数请楼主自己去整理,只为了说明情况。
    //从服务器中oracle旧表中取数据
     with qryOld do
                begin
                    close;
                    sql.clear;
                    sql.Add('select id1,id2 from table1');
                    open;
                end;
    //先清空本机中的paradox新表
    with DataParadox do
                begin
                  sql.clear;
                  sql.Add('SELECT * FROM TABLE2')
                  Open;
                end; 
    //插入数据  
     with qryParadox do
             begin
                 while(not qryOld.Eof) do
                        begin
                          append;
                          FieldByName('字段1').asString := qryOld.FieldByName('字段x').asstring;
                        end;
                //:更新到数据库
                qryParadox.UpdateAll;
              end;
      

  13.   

    陋了个字,是“对BDE不太熟”
      

  14.   

    找到解决方法了!按照 SaKura2003(小飞仔) 的思路,使用prepare!//插入数据  
     with qryNew do
             begin
                 close;
                        sql.Clear ;
                        Sql.Add('insert into table1');
                        Sql.Add('(id1,id2)');
                        Sql.Add('values');
                        Sql.Add('(:id1,:id2)');
    /////////////
                 prepare;             while(not qryOld.Eof) do
                        begin
                        
            ParamByName('id1').AsString:=qryOld.FieldByName('id1').AsString;
            ParamByName('id2').AsString:=qryOld.FieldByName('id2').AsString;                    execSql;
                        qryOld.Next ;
                        end;
    ////////////////////
            unprepare;            end;现在只要三四分钟就搞定了!
    to truexf(小方) :我也试了你的方法,但是不能使用UpdateAll这个过程。明白了你的思路,如果找到这个过程的话,我想你的方法应该很快的。
    不过呢这不要放假了吗!下班了,我也找到解决方案了,就先闪了。有兴趣的话节后再讨论吧!
    呵呵!谢谢你的参与!结贴!