数据库是ACCESS的数据库,用一个ADOQuery执行两条更新语句:
      
ADOQry2.Connection.BeginTrans;
ADOQry2.SQL.Clear;
if EdtOdograph.Text<>'' Then
    StrSql:='Update Rent set EndTime='''+ DateTimeToStr(Dt2)+''',Odograph2='+EdtOdograph.Text+' where RentID='+StrRentID
else
    StrSql:='Update Rent set EndTime='''+ DateTimeToStr(Dt2)+''' where RentID='+StrRentID;
    ADOQry2.SQL.Add(StrSql);
    ADOQry2.ExecSQL;    ADOQry2.SQL.Clear;
    if (iOdograph2>iOdograph1) then
          StrSql:='Update Car set State=''A'',Odograph='+EdtOdograph.Text+' where CarID='''+StrCarID+''''
    else
          StrSql:='Update Car set State=''A'' where CarID='''+StrCarID+'''';    ADOQry2.SQL.Add(StrSql);
    ADOQry2.ExecSQL;
    ADOQry2.Connection.CommitTrans;上述代码在我的测试系统下没有出现过错误,但是有一个用户的机器上确实出现了异常,并且根据他传达回的Access数据库发现,第一次ADOQry2.ExecSQL成功了,第二次却没有成功(第一句SQL的数据是修改了,但第二次没有修改),也就是说发生异常后“事务”更本没有起作用。请高手指教:
1、是否ACCESS数据库不支持事务,为什么在程序异常后,事务的一部分成功了,另一部分却没有执行?
2、为什么在某些系统下会出现异常?代码有什么问题吗?在第二次执行ADOQry2.SQL.Clear前是否有必要增加一句:ADOQry2.Close()?

解决方案 »

  1.   

      if not ADOQry2.Connection.InTransaction  then ADOQry2.Connection.BeginTrans;
      try
        ADOQry2.SQL.Clear;
        if EdtOdograph.Text<>'' Then
           StrSql:='Update Rent set EndTime='''+ DateTimeToStr(Dt2)+''',Odograph2='+EdtOdograph.Text+' where RentID='+StrRentID
        else
           StrSql:='Update Rent set EndTime='''+ DateTimeToStr(Dt2)+''' where RentID='+StrRentID;
        ADOQry2.SQL.text := StrSql;
        ADOQry2.ExecSQL;    ADOQry2.SQL.Clear;
        if (iOdograph2>iOdograph1) then
            StrSql:='Update Car set State=''A'',Odograph='+EdtOdograph.Text+' where CarID='''+StrCarID+''''
        else
           StrSql:='Update Car set State=''A'' where CarID='''+StrCarID+'''';    ADOQry2.SQL.text := StrSql;
        ADOQry2.ExecSQL;
         if ADOQry2.Connection.InTransaction  then ADOQry2.Connection.CommitTrans;
      except
         if ADOQry2.Connection.InTransaction then ADOQry2.Connection.RollbackTrans;
        raise;
      end;
      

  2.   

    刘德华建议你用ADOQry2.Connection.InTransaction 这个方法去判断是否是在事务中。
      

  3.   

    那么第二个问题大家怎么看呢"为什么在某些系统下会出现异常?代码有什么问题吗?在第二次执行ADOQry2.SQL.Clear前是否有必要增加一句:ADOQry2.Close()? 
    -------------------------------------
      

  4.   

    2、为什么在某些系统下会出现异常?代码有什么问题吗?在第二次执行ADOQry2.SQL.Clear前是否有必要增加一句:ADOQry2.Close()? 你这里有日期的转化,你看看出现异常的机器上的日期格式是什么样子的.
      

  5.   


    根据用户发回的数据库文件,我发现第一句SQL是成功执行了的(第二句没有执行成功),日期的转化主要在这一句中,所以应当可以排除是日期的可能吧?
      

  6.   


    如果ADOQry2上一次执行的是Open,那么第二次必须Close,如果执行的是ExecSQL,第二次可以不用close
      

  7.   

    事务没有起作用
    ADOQry2.Connection.BeginTrans
    try
      .....
      ADOQry2.Connection.CommitTrans;
    except
      ADOQry2.Connection.rollback;
    end;先保证事务能够起作用,然后,把错语信息写到一个日志中看看具体是什么内容
      

  8.   

    我給你的異常,你拋出來後貼上來看下。 我覺得你那個沒有拋出異常,也許就是條件導致執行的SQL沒有結果。