EOleException:BOF或EOF为True,或者当前记录已被删除。请求的操作需要当前记录

时间:2014-05-20 09:39:22

标签: delphi ado delphi-xe

我得到了这个例外:

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可以避免这个问题..

0 个答案:

没有答案