最近公司做个系统,用ADOQUERY往ACCESS中保存数据,代码如下:
    for row:=1 to SheetGrid.RowCount-1 do
      begin
        tmpADO.Close;
        tmpADO.SQL.Clear;
        tmpADO.sql.add('insert into Contact(ContactId,ContactName,ContactMobile,HeadShip,Sex,Birthday,CoFax,CoAddr,'+
          'HomeTel,HomeAddr,Email,CoDept,CoTel,Description,Province,City,Trade,CoName) values (:ContactId,:ContactName,:ContactMobile,:HeadShip,:Sex,:Birthday,:CoFax,:CoAddr,:HomeTel,:HomeAddr,:Email,:CoDept,:CoTel,:Description,:Province,:City,:Trade,:CoName)');
/////////////////////////////////////////////////
                  tmpADO.Parameters.ParamByName('ContactId').Value :=cid;
          tmpADO.Parameters.ParamByName('ContactName').Value := name;
          tmpADO.Parameters.ParamByName('ContactMobile').Value :=mobile;
           tmpADO.Parameters.ParamByName('HeadShip').Value:=pos;
           tmpADO.Parameters.ParamByName('Sex').Value :=sex;
            tmpADO.Parameters.ParamByName('Birthday').Value := birthday;
            tmpADO.Parameters.ParamByName('CoFax').Value :=fax;
            tmpADO.Parameters.ParamByName('CoAddr').Value := coAddr;
            tmpADO.Parameters.ParamByName('HomeTel').Value :=hometel;
            tmpADO.Parameters.ParamByName('HomeAddr').Value := homeAddr;
            tmpADO.Parameters.ParamByName('Email').Value :=email;
            tmpADO.Parameters.ParamByName('CoDept').Value :=depart;
            tmpADO.Parameters.ParamByName('CoTel').Value :=cotel;
            tmpADO.Parameters.ParamByName('Description').Value :=desc;
            tmpADO.Parameters.ParamByName('Province').Value :=province;
            tmpADO.Parameters.ParamByName('City').Value :=city;
            tmpADO.Parameters.ParamByName('Trade').Value := trade;
            tmpADO.Parameters.ParamByName('CoName').Value :=coname;
           tmpADO.Execsql;
            end;
数据库表的字段可能比较多,有十几个,采用的是逐条插入。速度太慢了,1秒钟就三十多条,想请问各位大虾们,这插入速度正不正常?有没有比较快的操作方法?

解决方案 »

  1.   

    前不久好像有高人测试过,ADO的速度好像是最慢的,用DBExpress最快
      

  2.   

    发了相同的帖?把答案拷贝过来:别用这种执行插入语句的方式,可以使用批量提交,具体是先设置TADOQuery的LcokType为ltOptimistic,一个一个添加和Post(这个时候是先保存在本地),然后用UpdateBatch(arAll)提交到数据库
      

  3.   

    可以考虑生成所有的SQL语句,然后一次执行例如 insert into table1(field1, field2)
    select value1, value2
    union 
    select value3, value4
    union 
    select value5, value6
      

  4.   

    稍微改动下会快点,将频繁的关闭拿到循环外
    var
      sqlstr:string;begin
      sqlstr := 'insert into Contact'+
        '(ContactId,ContactName,ContactMobile,HeadShip,Sex,Birthday,'+
        'CoFax,CoAddr,HomeTel,HomeAddr,Email,CoDept,CoTel,Description,'+
        'Province,City,Trade,CoName) values(:ContactId,:ContactName,'+
        ':ContactMobile,:HeadShip,:Sex,:Birthday,:CoFax,:CoAddr,:HomeTel,'+
        ':HomeAddr,:Email,:CoDept,:CoTel,:Description,:Province,:City,:Trade,:CoName)';
      tmpADO.Close;
      tmpADO.SQL.Clear;
      tmpADO.sql.add(sqlstr);
      for row:=1 to SheetGrid.RowCount-1 do
      begin
       tmpADO.Parameters.Items[0].Value :=cid;
       tmpADO.Parameters.Items[1].Value := name;
       tmpADO.Parameters.Items[2].Value :=mobile;
       ....
       tmpADO.Execsql;
      end;
    end;