以下是我写数据入库的函数,i_sInSqlLst 存放着数据插入语句,循环读插入语句然后执行,目前插入800条就要1分钟,如何改进才能加快速度?function TfrmAnalyze.InsertData(i_sInSqlLst: TStringList): boolean;
var
  i: integer;
  strSql: string;
begin
  result := false;
  try
    for i := 0 to i_sInSqlLst.Count - 1 do
    begin
      strSql := i_sInSqlLst.Strings[i];
      dm.adoqry.SQL.Clear;
      dm.adoqry.SQL.Add(strSql);
      dm.adoqry.ExecSQL;
      self.WriteAnaLog('第 '+inttostr((i+1))+' 条入库成功!');
      application.ProcessMessages;    end;
    result := true;
  finally
    dm.adoqry.Close;
  end;
end;

解决方案 »

  1.   

    odac控件组;
    先用table打开要导入的表,然后append数据到table,最后update,不知这样会不会快;
      

  2.   

    数据是从文本读的,表名就是文件名,然后解析文本将数据插入对应表,不好用table
      

  3.   

    利用一个存储过程,把sql的多条语句放在一起,交给存储过程去执行,会不会快些呢.
      

  4.   

    转成Insert SQL Script,按事务分笔提交例如
    begin
    insert into test values('Noname',0,0.45);
    insert into test values('Noname',0,0.45);
    insert into test values('Noname',0,0.45);
    commit;
    end;
    /
    begin
    insert into test values('Noname',0,0.45);
    insert into test values('Noname',0,0.45);
    insert into test values('Noname',0,0.45);
    commit;
    end;
    其中斜杠(/)是两个笔记录的分隔线
      

  5.   

    Oracle下没有测试过,在MSSQL下(写法有所不一样)一个事务提交500行是比较理想的。
      

  6.   

    最好在向i_sInSqlLst添加数据的时候加一些commit将i_sInSqlLst保存成文件,例如保存成c:\123.sql
    var
      s:string;
    begin
      s:='c:\123.sql';
      WinExec(pchar('sqlplus user/pwd@orcl '+s),sw_hide);
    end;
      

  7.   

    oracle可以根据服务器的性能,选择要提交的记录数
      

  8.   

    我现在试着用事务,可总出现invalid character错误,但我把dm.adoqry.SQL里的sql取出来放到toad执行却没错function TfrmAnalyze.InsertData(i_sInSqlLst: TStringList): boolean;
    var
      i: integer;
      strSql,str: string;
    begin
      result := false;
      try
        try
          dm.adocon.BeginTrans;
          dm.adoqry.SQL.Clear;
          for i := 0 to i_sInSqlLst.Count - 1 do
          begin
            strSql := i_sInSqlLst.Strings[i];
            dm.adoqry.SQL.Add(strSql);
          end;
          dm.adoqry.SQL.Add('commit;');
          dm.adoqry.ExecSQL;
          dm.adocon.CommitTrans;
          result := true;
        except
          dm.adocon.RollbackTrans;
        end;
      finally
        dm.adoqry.Close;
      end;
    end;
      

  9.   

    事物不是那样搞的,建议用sql loader,那样速度快很多
      

  10.   

    用sql loader 怎么写的啊??
      

  11.   

    用SQL Server的DTS试一下,不过要控制记录比较多的表单独来速度会比较快,但要达到通过DTS在ACCESS与SQLSERVER之间的速度是不可能的。
      

  12.   

    我用hongqi162 的方法试了下,好像数据没有插入function TfrmAnalyze.InsertData1(s:string): boolean;
    var
      i: integer;
      strSql,str: string;
    begin
      result := false;
      WinExec(pchar('sqlplus HOSTS/HOSTS@IPDB1 c:\aa.sql'),sw_hide);
      result := true;
    end;
    aa.sql的内容如下:
    insert into U_LSDEV_C(L2CACHE0,AVAILABLE,REPORT_DATE,TRAN_ID) values('aio0','Available',to_date('20080131111300','yyyy-mm-dd hh24:mi:ss'),138);
    insert into U_LSDEV_C(L2CACHE0,AVAILABLE,REPORT_DATE,TRAN_ID) values('cd0','Available',to_date('20080131111300','yyyy-mm-dd hh24:mi:ss'),138);
    insert into U_LSDEV_C(L2CACHE0,AVAILABLE,REPORT_DATE,TRAN_ID) values('dac0','Available',to_date('20080131111300','yyyy-mm-dd hh24:mi:ss'),138);
    insert into U_LSDEV_C(L2CACHE0,AVAILABLE,REPORT_DATE,TRAN_ID) values('dac1','Available',to_date('20080131111300','yyyy-mm-dd hh24:mi:ss'),138);
    insert into U_LSDEV_C(L2CACHE0,AVAILABLE,REPORT_DATE,TRAN_ID) values('dar0','Available',to_date('20080131111300','yyyy-mm-dd hh24:mi:ss'),138);
    insert into U_LSDEV_C(L2CACHE0,AVAILABLE,REPORT_DATE,TRAN_ID) values('data_4g_0068','Available',to_date('20080131111300','yyyy-mm-dd hh24:mi:ss'),138);
    insert into U_LSDEV_C(L2CACHE0,AVAILABLE,REPORT_DATE,TRAN_ID) values('data_4g_0069','Available',to_date('20080131111300','yyyy-mm-dd hh24:mi:ss'),138);
    insert into U_LSDEV_C(L2CACHE0,AVAILABLE,REPORT_DATE,TRAN_ID) values('data_4g_0070','Available',to_date
    commit;但我直接用sqlplus执行aa.sql数据很快就插入呢,这是怎么回事???
      

  13.   

    function TfrmAnalyze.InsertData(i_sInSqlLst: TStringList): boolean;
    var
      i: integer;
      strSql,str: string;
    begin
      result := false;
      try
          dm.adoqry.SQL.Clear;
          dm.adoqry.LoadFromFile('c:\aa.sql');
          dm.adoqry.ExecSQL;
          result := true;
      finally
        dm.adoqry.Close;
      end;
    end;用这种方式也不行,LoadFromFile时会报错“无法从指定的源创建记录集。源文件或流必须包含 XML 或 ADTG 格式的记录集数据”
      

  14.   

    hongqi162的方法里写错了,应该是WinExec(pchar('sqlplus   HOSTS/HOSTS@IPDB1 @c:\aa.sql'),sw_hide); 少加了个'@' ,现在我决定用这种方法入库,888条数据只用了 4 秒钟,爽啊!!!