最近公司做个系统,用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.   

    别用这种执行插入语句的方式,可以使用批量提交,具体是先设置TADOQuery的LcokType为ltOptimistic,一个一个添加和Post(这个时候是先保存在本地),然后用UpdateBatch(arAll)提交到数据库
      

  2.   

    稍微改动下会快点,将频繁的关闭拿到循环外
    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;
      

  3.   

    个人习惯写成  SQL  直接提交,
      

  4.   

    var
      sqlstr:string;begin
      sqlstr := 'select * from Contact where 1<>1';
      tmpADO.Close;
      tmpADO.SQL.Clear;
      tmpADO.sql.add(sqlstr);
      tmpADO.open;
      tmpADO.edit;
      tmpADO.FieldByName('ContactId').Value :=cid;
      tmpADO.FieldByName('ContactName').Value := name;
      tmpADO.FieldByName('ContactMobile').Value :=mobile;
      tmpADO.FieldByName('HeadShip').Value:=pos;
      tmpADO.FieldByName('Sex').Value :=sex;
      ......
       tmpADO.post;
    end;
      

  5.   

    综合以上各位的意见,我把程序改成如下,速度大概1S 70条,不知道这速度正常否?var
      sqlstr:string;begin  tmpADO.CursorType := ctKeyset;
      tmpADO.LockType:=ltBatchOptimistic;
      sqlstr := 'select * from Contact where 1<>1';
      tmpADO.Close;
      tmpADO.SQL.Clear;
      tmpADO.sql.add(sqlstr);
      for row:=1 to SheetGrid.RowCount-1 do
       tmpADO.open;
      tmpADO.append;
      tmpADO.FieldByName('ContactId').Value :=cid;
      tmpADO.FieldByName('ContactName').Value := name;
      tmpADO.FieldByName('ContactMobile').Value :=mobile;
      tmpADO.FieldByName('HeadShip').Value:=pos;
      tmpADO.FieldByName('Sex').Value :=sex;
      ......
      tmpADO.post;
      ......
       tmpado.UpdateBatch(arall);end;