我用的是 ACCESS数据库。其中有这样一种问题:for i:=0 to 100 do
begin
    for j:=0 to 1000 do 
    begin
         AdoQuery1.close;
         AdoQuery1.SQL.Clear;
         AdoQuery1.SQL.Add('insert into tbtable1(vcname) values( val)');
         AdoQuery1.Parameters.ParamByName('val').value:=edit1.text;
         AdoQuery1.Prepared;
         AdoQuery1.ExecSQL;
    end;
end;在循环中我多次开关了adoquery,请问用什么办法可以提高我的这个效率吗?
请各位大侠不吝赐教!

解决方案 »

  1.   

    ADOQuery1.Close;
    ADOQuery1.LockType := ltBatchOptimistic;
    ADOQeury1.SQL.Clear;
    ADOQuery1.SQL.ADD('SELECT TOP 0 vcname from tbtablel')
    ADOQuery1.Open;
    for i:=0 to 100 do
    begin
        for j:=0 to 1000 do 
        begin
           ADOQuery1.Append;
           ADOQuery1.FieldByName('val').value:=edit1.text;
          ADOQuery1.Post
        end;
    end;
    ADOQuery1.UpdateBatch;
      

  2.   

    用批量更新
    with ADODataSet1 do begin
      CursorLocation := clUseClient;
      CursorType := ctStatic;
      LockType := ltBatchOptimistic;
      CommandType := cmdText;
      CommandText := 'SELECT * FROM Employee';
      Open;
    end;

    ADODataSet1.UpdateBatch(arCurrent);
      

  3.   

    同意sz1008(Need For Speed) 
    他的可以解决你的问题
      

  4.   

    sz1008(Need For Speed):
    我现在做 insert into tbtable1(vc1,vc2,vc3,vc4) values(val1,val2,val3,val4)请问:ADOQuery1.SQL.ADD('SELECT TOP 0 vcname from tbtablel')
    这句该怎么写呢?谢谢。
      

  5.   

    ADOQuery1.SQL.ADD('SELECT TOP 0 val1,val2,val3,val4 from tbtablel')
      

  6.   

    sorry;
    ADOQuery1.SQL.ADD('SELECT TOP 0 vc1,vc2,vc3,vc4 from tbtablel')
      

  7.   

    firetoucher(风焱) 
    我不是很清楚这种做法,
    我是这样做的:with ADODataSet1 do 
    begin
      CursorLocation := clUseClient;
      CursorType := ctStatic;
      LockType := ltBatchOptimistic;
      CommandType := cmdText;
    end;for i:=0 to 100 do
    begin
        for j:=0 to 1000 do
        begin
              ADODataSet1.CommandText := 'insert into tbtable1 (vc1,vc2,vc3,vc4)  '+
                                          'values(val1,val2,val3,val4)';
              ADODataSet1.Parameters.ParamByName('val1').value:=edit1.text;
              ADODataSet1.Parameters.ParamByName('val2').value:=edit2.text;
              ADODataSet1.Parameters.ParamByName('val3').value:=edit3.text;
              ADODataSet1.Parameters.ParamByName('val4').value:=edit4.text;
              ADODataSet1.Open;
        end;
    end;ADODataSet1.UpdateBatch(arCurrent);
    请问是这样的吗?但是在运行的时候说 :Parameter ‘val1' not found.
    请问我错在什么地方了呢?还请多多指教。:)
      

  8.   

    ADODataSet1.Parameters.ParamByName('val1').value:=edit1.text;
    应为
    ADODataSet1.Parameters.ParamByName(':val1').value:=edit1.text;
    其余类同
      

  9.   

    sz1008(Need For Speed) :您好:
    select 子句包含一个保留字,拼写错误,或丢失的参数,或标点符号不正确。ADOQuery1.SQL.ADD('SELECT TOP 0 vc1,vc2,vc3,vc4 from tbtablel');
    ADOQuery1.Open;
    运行到这里就出上面的那个错误。
    请问是什么问题呢?谢谢。。
      

  10.   

    我用的是SQL Server,Acess的话我也不清楚了 :(
      

  11.   

    sz1008(Need For Speed) :
    不好意思。我刚才照
    ADODataSet1.Parameters.ParamByName(':val1').value:=edit1.text;
    调试了一下,还是会出以上的Parameter ‘val1' not found 的问题。
    不知道是不是以下这句有问题:
    ADODataSet1.CommandText := 'insert into tbtable1 (vc1,vc2,vc3,vc4)  '+
                                          'values(val1,val2,val3,val4)';
       我在val1改为:val1也是同样的问题。       
      

  12.   

    sz1008(Need For Speed) :
    我在access 中的查询中:select top 10 from tbtable1 也select 子句包含一个保留字,拼写错误,或丢失的参数,或标点符号不正确。这个问题。所以可能是access不支持这个语法。
    非常谢谢你。我看看不要这个top 0可不可以。。
      

  13.   

    是我自己看花了 :-P
    ADODataSet1.CommandText := 'insert into tbtable1 (vc1,vc2,vc3,vc4)  '+
                                          'values(:val1,:val2,:val3,:val4)';
              ADODataSet1.Parameters.ParamByName('val1').value:=edit1.text;
              ADODataSet1.Parameters.ParamByName('val2').value:=edit2.text;
              ADODataSet1.Parameters.ParamByName('val3').value:=edit3.text;
              ADODataSet1.Parameters.ParamByName('val4').value:=edit4.text;
      

  14.   

    我去掉top 0不行了,运行是没有错误,但是没有添加到到数据表中。
      

  15.   

    ADODataSet1.CommandText := 'insert into tbtable1 (vc1,vc2,vc3,vc4)  '+
                                          'values(:val1,:val2,:val3,:val4)';
              还是不能运行。:)
    谢谢你啊
      

  16.   

    sz1008(Need For Speed) :
    用append,post的方式,效率差不多,我插入15000多条记录都要一分多钟。
    至于第二种方式,我没有得出要领。我看了一下李维的那本ado/mts/com。有关于UPDATEBATCH的技术说明,好象收获不大。
      

  17.   

    不要多次执行。
    AdoQuery1.SQL.Clear;
    AdoQuery1.close;
    for i:=0 to 100 do
    begin
        for j:=0 to 1000 do 
        begin
    //         AdoQuery1.close;
    //         AdoQuery1.SQL.Clear;
    //         AdoQuery1.SQL.Add('insert into tbtable1(vcname) values( val)');
    //         AdoQuery1.Parameters.ParamByName('val').value:=edit1.text;
             AdoQuery1.SQL.Add('insert into tbtable1(vcname) values('' +edit1.text + ''') ';
    //         AdoQuery1.Prepared;
    //         AdoQuery1.ExecSQL;
        end;
    end;
    AdoQuery1.Prepared;
    AdoQuery1.ExecSQL;  //只做一次执行
      

  18.   

    整理一下:
    AdoQuery1.SQL.Clear;
    AdoQuery1.close;
    for i:=0 to 100 do
    begin
        for j:=0 to 1000 do 
        begin
           AdoQuery1.SQL.Add('insert into tbtable1(vcname) values('' +edit1.text + ''') ';
        end;
    end;
    AdoQuery1.Prepared;
    AdoQuery1.ExecSQL;  //只做一次执行
      

  19.   

    wangxj333(天天真人) :
    呵呵,兄弟,你这样不行,一:只插入一条记录。二:虽然只插入一条,但是也花费80多秒。