我是一个新手
问题一
用adoquery读取数据,只对一个表进行插入数据(一次插入30-40条左右),是用adoquery.append  post插入好还是用sql.add(insert)  execsql好上面两种插入方法有什么区别,在什么情况下用那种方法,谢谢了问题二
如果要对两个表进行插入(用adoquery.append  post)这种方法,先插入一个表,在插入第二个表时发生错误,希望进行回滚,撤销已插入第一个的数据,该怎么实现呢?

解决方案 »

  1.   

    问题一 sql.add(insert)快,append  是在 已打开的数据集中追加一条记录,只是一条,insert通过sql语句可以批量插入数据
    问题二 如果是联合查询得到的表,append,post肯定要出错,post对单表有效,这时要用sql语句更新
      

  2.   


    1. Add insert  語句。  AdoQuery1.prepare; 後執行 execql . 效率會高點2. 可以通過事務來處理;  if not AdoQuery.connection.inTransAction then AdoQuery.Connection.BeginTran;
      try
       post...;    adoquery.connection.Commit;
      except
       AdoQuery.Connection.Rollback;
      end;上面都是直接手寫的,可能有筆誤,見諒,意思應該表達清楚了。呵呵
      

  3.   

    append,post可以用事务处理码?怎样insert通过sql语句批量插入数据
      

  4.   

    try
        ADOConnectionDM.ADOConnection2.BeginTrans;
        adoq.SQL.Add('select * from tabbar');
        adoq.open;
        c1:='0';
        while not adoq.Eof do
        begin
            adoq1.SQL.Add('insert into dbo.tabbar(barcode,scantime,userid,lip) values ('''+adoq.Fields[0].AsString+''','''+adoq.Fields[1].AsString+''','''+adoq.Fields[2].AsString+''','''+adoq.Fields[3].AsString+''')');
            adoq.Next;
            c1:='1';
        end;
        adoq1.ExecSQL;
        adoq.Close;
        adoq.SQL.Clear;
        adoq.SQL.Add('delete from tabbar');
        adoq.ExecSQL;
        b1:=true;
        ADOConnectionDM.ADOConnection2.CommitTrans;
        except
           ADOConnectionDM.ADOConnection2.RollbackTrans;
           b1:=false;
        end;这是批量提交的例子
      

  5.   

    append,post可以用事务处理码?
      

  6.   


    问题一:
      可以考虑利用delphi中ADO组件的批量更新模式或拼接SQL语句实现。
              
    问题二:
      考虑第一个表在利用即时更新模式处理,即Append,post方式。
      同时对于第二个需要提交的数据集可以使用事务+批量更新模式处理。    
      1、begin tran
      2、ExecSQL('Insert into Table1 values() '); 
      3、ADOQuery1.LockType := ltBatchOptimistic;
         SQL条件...
         ADOQyery1.open;
         while not ADOQuery1.Eof do
        begin
          ADOQuery1.Append;
          ADOQuery1.fieldbyName('XX').value := 'aa';
          ...
          ...   
          ADOQuery1.Next; 
         end;
        ADOQuery1.UpdateBatch(arAll);
      4、commit tran
      

  7.   

    在ADOQuery1.Next的前面用ADOQuery1.Post码?
      

  8.   

    在ADOQuery1.Next的前面用ADOQuery1.Post码?
      

  9.   

    是的。
    ADOQuery1.UpdateBatch(arAll); 
    才会真正提交到数据库中。