先声明,需要用delphi来实现现在有两个表,table1和table2两个表
结构一样
我想将table1中的数据导入到table2中,数据量有几十万条,如果发现记录重复或其他错误,需要写日志文件。代码如下:
            adoquery1.close;
            adoquery1.sql.clear;
            sqlStr := 'select * from '+oldTableName;
            try
                adoquery1.sql.add(sqlStr);
                adoquery1.Prepared:=true;
                adoquery1.Open;
                adoquery1.Prepared:=false;
                adoquery1.first; //移动到第一个记录
            except
               on E: Exception do
               begin
                   AppendLineToFile(logFileName,'旧系统表或视图不存在:'+oldTableName+';'+newTableName+';'+E.Message+sqlStr);//写日志文件
                   continue;
               end;
            end;
            //取得所有字段名字
            sqlTable :='';
            for i:=0 to adoquery1.FieldCount-2 do
            begin
                sqlTable := sqlTable +  adoquery1.Fields[i].FieldName +','
            end;
            sqlTable := sqlTable +  adoquery1.Fields[i].FieldName ;            //逐条记录添加            while (not adoquery1.eof) do
            begin
                if stop_flag='true' then exit;
                sqlStr:=' Insert into '+ newTableName +'('+ sqlTable+')values(';
                for i:=0 to adoquery1.FieldCount-2 do
                begin
                    s_value := adoquery1.Fields[i].AsString;
                    s_value:=StringReplace(s_value,s_old,s_new,[rfReplaceAll])  ;
                    sqlStr := sqlStr + ''''+s_value+''','
                end;
                s_value := adoquery1.Fields[i].AsString;
                s_value:=StringReplace(s_value,s_old,s_new,[rfReplaceAll])  ;
                sqlStr := sqlStr +''''+ s_value+''')';
    adoquery2.close;
    adoquery2.sql.clear;
    adoquery2.sql.add(sqlStr);
    try
      adoquery2.Prepared:=true;
      adoquery2.ExecSQL;
      adoquery2.Prepared:=false;
    except
        on E: Exception do
        begin
            AppendLineToFile(logFileName,oldTableName+';'+newTableName+';'+E.Message+sqlStr);//写日志文件
         end;
    end;                adoquery1.next; //移动到下一条记录
            end;
各位有什么好的办法可以提高速度么???
用ExecSQL好像是执行后就直接commit了,
可不可以有一个办法让一次相当于commit1000条记录?
最重要的我要记录错误的日志文件!!!
帮忙了,一定给分

解决方案 »

  1.   

    还有用EXECSQL是执行SQL语句,是不是COMMIT还是ROALLBACK你可以在SQL语句中写异常处理阿
      

  2.   

    没别的办法么,用batchmove的话日志怎么处理
      

  3.   

    你所谓的速度是多快?我通过自己写的程序在interbase5和oracle之间互导,用p4的机器每10万条大概需要1小时,你的要求呢?
    我的办法是一条一条度出来,然后写进去,如果两个表在一个数据库中,就直接写存储过程吧,如果是两个数据库,或者两个类型的数据库建议你还是通过逐条写入的办法,这样好象比较容易控制进度和错误日至
      

  4.   

    数据量大的话,对  adoquery1。next这种语句影响大么?
      

  5.   

    写存储过程吧,要逐条判断的话
    用游标依次读数据
    偶在ORACLE里同一库导数据,加上数据检验转换
    1000条/秒
      

  6.   

    最近看到很多关于数据库操作的问题,上来就说我要怎么怎么样,搞了半天都不知道用什么数据库,
    什么主机,b4一下.楼主说一下用什么数据库?oracle的话也许我可以帮你.
      

  7.   

    还有,两个表结构一样吗?
    不一定要用delphi的,也许换个方法会好很多.