数据库是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()?
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()?
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;
-------------------------------------
根据用户发回的数据库文件,我发现第一句SQL是成功执行了的(第二句没有执行成功),日期的转化主要在这一句中,所以应当可以排除是日期的可能吧?
如果ADOQry2上一次执行的是Open,那么第二次必须Close,如果执行的是ExecSQL,第二次可以不用close
ADOQry2.Connection.BeginTrans
try
.....
ADOQry2.Connection.CommitTrans;
except
ADOQry2.Connection.rollback;
end;先保证事务能够起作用,然后,把错语信息写到一个日志中看看具体是什么内容