我得到了这个例外:
EOleException:BOF或EOF为True,或者当前记录已被删除。请求的操作需要当前记录
尝试删除记录:
if SetupTable.Locate('MyFieldName', AKey, []) then
SetupTable.Delete
这里发生的是检查数据库中是否存在记录,如果存在,则将其删除。我的问题是记录确实存在,但删除它会产生上述异常。
它是单个用户设置,并且记录无法在执行这两行之间消失。
此代码已运行8年。例外情况仅发生在Windows 8上。我已在5个不同的客户站点看到它。使用Windows XP,Vista,7的客户不会看到问题。
我使用Delphi XE通过ADO与提供程序Microsoft.Jet.OLEDB.4.0访问MS Access数据库
这是一个堆栈转储:
0073f59d DSALon.exe ADODB 4712 DoRecordsetDelete
0073f5b6 DSALon.exe ADODB 4719 TCustomADODataSet.InternalDelete
006b3dd1 DSALon.exe DB 12947 TDataSet.CheckOperation
006b3ad8 DSALon.exe DB 12856 TDataSet.Delete
007cade6 DSALon.exe DatabaseUnit 629 ClearSetup
ADODB中有问题的代码如下所示:
procedure DoRecordsetDelete(DataSet: TCustomADODataSet; AffectRecords: TAffectRecords);
begin
with DataSet do
try
Recordset.Delete(AffectRecordsValues[AffectRecords]);
{ When CacheSize > 1, Recordset allows fetching of deleted records.
Calling MovePrevious seems to work around it }
if (CacheSize > 1) and (PRecInfo(ActiveBuffer).RecordNumber <> 1) then
begin
Recordset.MovePrevious;
Recordset.MoveNext;
end;
Recordset.MoveNext;
except
on E: Exception do
begin
Recordset.CancelUpdate;
DatabaseError(E.Message);
end;
end;
end;
这让我认为CacheSize与此相关。我确实使用了CacheSize&gt; 1。
ADO CacheSize属性的MSDN帮助说:
如果将CacheSize设置为大于1的值,则导航方法(Move,MoveFirst,MoveLast,MoveNext和MovePrevious)可能会导致导航到已删除的记录,如果在检索到记录后发生删除。在初始提取之后,在您尝试从已删除的行访问数据值之前,后续删除将不会反映在数据高速缓存中。但是,将CacheSize设置为1会消除此问题,因为无法获取已删除的行。
尽管如此,我仍然100%确定我尝试删除的记录尚未删除。
但也许在Locate之前进行Resync可以避免这个问题..