用ADO做数据库连接时,多表更新如何控制?就象BDE的TUpdateSQL的效果.
比如我在一个ADOQuery中写下:
select a.*,b.DeptName,c.PositionName
from Smt_User a left join Smt_Dept b on a.DeptId = b.DeptId
                left join Smt_Position c on a.PositionId = c.PositionId
where a.UserId = :UserId做数据提交时就会出错,该怎么办?

解决方案 »

  1.   

    dm.ADOConn.BeginTrans;  //开始事务
              try
                str:='insert into tkucun(fbm,fkh,fsl,fdj,fje) ';
                str:=str+' values('''+cxtextedit1.Text+''','''+cxbox1.Text+''','+cxedit1.Text+','+cxedit3.Text+','+Floattostr(StrToFloat(cxedit5.Text)+StrToFloat(cxedit6.Text))+')';
                //application.MessageBox(pchar(str),0,0);
                tmp.SQL.add(str);
                tmp.ExecSQL;
                tmp.SQL.Clear;
                str:='insert into truku(fdh,fbm,fkh,frq,fglr,fhth,fsl,fdj,fje,fbz,fren,fyf) ';
                str:=str+' values('''+ruku.cxTextEdit1.Text+''','''+cxtextedit1.Text;
                str:=str+''','''+cxbox1.Text+''','''+ruku.cxDate.Text+''','''+ruku.cxTextEdit2.Text;
                str:=str+''','''+cxtextedit5.Text+''','+cxedit1.Text+','+cxedit3.Text+','+cxedit5.Text+','''+cxmemo1.Text+''','''+frmlogin.struser+''','+cxedit6.text+')';
                tmp.SQL.Add(str);
                tmp.ExecSQL;
                tmp.Close;
                dm.ADOConn.CommitTrans;      //更新表后结速事务
              except
                application.messagebox('更新库存出错啦!!!','提示',MB_iconInformation + MB_OK);
                dm.ADOConn.RollbackTrans;    //更新一个表出错回滚数据
                abort;
              end;
      

  2.   

    上边太乱了,简单点。。
    dm.ADOConn.BeginTrans;  //开始事务try
      {更新多个表代码}
      dm.ADOConn.CommitTrans;      //更新表后结速事务
    except   //更新出错
      dm.ADOConn.RollbackTrans;    //更新一个表出错回滚数据
    end;
      

  3.   

    这个问题几个月前我回答过一个人。
    ADO虽然没有直接提供类似BDE TUpdateSQL的功能,但是可以利用 TDataSetProvider 来实现。ADOQuery -> DataSetProvider -> ClientDataSet在 DataSetProvider 的 BeforeUpdateRecord等一些事件中,你能看到TUpdateSQL的影子,感觉你能用TUpdateSQL 理解他也就不难,稍微看下帮助你就理解他和TUpdateSQL多像了。