procedure TfmeEvtReg.SaveInsert();
begin
////////////////////////////////
      代码块A////////////////////////////////      代码块B
/////////////////////////////////效果要求如下
//在整个程序代码的执行过程中,一但遇到错误就取消所有的执行
//就像数据库的事务一样,要不全部给我执行该过程,要不全部都不执行//晕,有点不太可能,因为代码块A和代码块B中都有数据库的insert记录
//***********而且是A中插入1条记录,B中就会插入几条(数目确定)记录(数据来自delphi界面)的那种情况*********
//嗯嗯,是个值得琢磨的问题。
end;

解决方案 »

  1.   

    代码块A
    代码块B
    insert操作的表是不同的。
    你的方法不太可行
      

  2.   

    这个方法不好,要多加两个表作为临时表使用
    因为我使用oracle数据库,临时表跟mssql区别很大,
    oracle一般不建议动态建表
      

  3.   

    vb下可使用如下方式实现的--tm=mastertable,ts=sub table
    很久不用,语法一时也想不起,用pascal语法,对mssql操作,对oracle时好象不可以用分号分隔一句sql的,在一个
    C#的帖子象看到过是使用begin end;来分隔的
    sql:='insert into values(1,''xyz'')'
    for i:=0 to n do//n为插入从表ts的不定记录数
      sql:=sql + ';insert into ts values(i,''' + intostrdef(i,0) + ''')'
    conn.beginTran
    conn.execute(sql);
    on Error GoTo ErrHandler;
    conn.commitTran;
    //错误处理
    ErrHandler:conn.RollBackTran;//delphi不知道是否可以这样做
    vb中可以用分号来分隔单句的sql,但delphi的adoquery.add方法测试过是不可以的
    try
      qry.beginTran;
      qry.sql.add('insert into values(1,''xyz'')');
      for i:=0 to n do
        qry.sql.add()'insert into ts values(i,''' + intostrdef(i,0) + ''')';
        qry.execsql;
      qry.commitTran;
    except
      qry.RollBackTran;
    end;
    //如果在执行sql之前qry.sql.add可以反复的add进SQL的话,那么也是很好解决这个问题的^o^
      

  4.   

    vb中的实现在发完贴后觉得不好,
    事务可以直接写在sql变量中
    sql:= 'begin set xact_abort begintran insert into values(1, ' 'xyz ' ') ' 
    for i:=0 to n do//n为插入从表ts的不定记录数 
      sql:=sql +  ';insert into ts values(i, ' ' ' + intostrdef(i,0) +  ' ' ') commit tran'
    conn.execute(sql); 
      

  5.   

    //  ADODataSet_Main.LockType := ltBatchOptimistic;
    //  ADODataSet_Detail.LockType := ltBatchOptimistic;
    try
      ADOConnection1.beginTran; 
      ADODataSet_Main.Insert;
      // Insert Main data
      ADODataSet_Main.Post;
      for i := 0 to n begin
        ADODataSet_Detail.Insert;
        // Insert Detail data
        ADODataSet_Detail.Post;
      end;
      ADOConnection1.commitTran;
    except
      ADOConnection1.RollBack;
    end;
      

  6.   

    嘿,终于有人给出delphi实现这个的代码了我只是知道原理,但delphi就不知道怎么去写
    谢谢楼上大兄
      

  7.   

      adoconnect1.BeginTran;
      try
        ...
      exception
        adoconnect1.RollbackTran;
      end;不明白 看不懂  以上几行是否合题意?
      

  8.   

    符合的,你对ADO如何执行SQL不懂而已
      

  9.   

    你对ADO如何执行SQL不懂而已
    ========================_-##   我话的意思是说我不明白你题目的意思  怕回答简单了    然后你得出了"你对ADO如何执行SQL不懂而已"这样的结论...