Delphi EOleException:BOF或EOF为真,或者当前记录已被删除。请求的操作需要当前记录
我得到一个例外: EOleException:BOF或EOF为真,或者当前记录已被删除。请求的操作需要当前记录 正在尝试删除记录:Delphi EOleException:BOF或EOF为真,或者当前记录已被删除。请求的操作需要当前记录,delphi,ado,delphi-xe,Delphi,Ado,Delphi Xe,我得到一个例外: EOleException:BOF或EOF为真,或者当前记录已被删除。请求的操作需要当前记录 正在尝试删除记录: if SetupTable.Locate('MyFieldName', AKey, []) then SetupTable.Delete 这里要做的是检查数据库中是否存在记录,如果存在,则删除记录。我的问题是记录确实存在,但删除它会产生上述异常 这是一个单用户设置,在执行这两行之间,记录不可能消失 这段代码已经运行了8年了。此异常仅在Windows 8上发生。
if SetupTable.Locate('MyFieldName', AKey, []) then
SetupTable.Delete
这里要做的是检查数据库中是否存在记录,如果存在,则删除记录。我的问题是记录确实存在,但删除它会产生上述异常
这是一个单用户设置,在执行这两行之间,记录不可能消失
这段代码已经运行了8年了。此异常仅在Windows 8上发生。我在5个不同的客户网站上看到过。使用Windows XP、Vista、7的客户看不出问题所在
我使用DelphiXE通过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;
procedure-DoRecordsetDelete(数据集:TCustomADODataSet;影响记录:TAffectRecords);
开始
用数据集做什么
尝试
Delete(AffectRecords值[AffectRecords]);
{当CacheSize>1时,记录集允许获取已删除的记录。
调用MovePrevious似乎可以解决此问题}
如果(CacheSize>1)和(PRecInfo(ActiveBuffer).RecordNumber为1),则
开始
记录集.MovePrevious;
Recordset.MoveNext;
结束;
Recordset.MoveNext;
除了
关于E:Exception-do
开始
Recordset.CancelUpdate;
数据库错误(E.Message);
结束;
结束;
结束;
这让我认为缓存大小与此相关。我使用的缓存大小大于1
ADO CacheSize属性的MSDN帮助说明:
如果将CacheSize设置为大于1的值,则如果在检索记录之后发生删除,则导航方法(Move、MoveFirst、MoveLast、MoveNext和MovePrevious)可能会导致导航到已删除的记录。在初始获取之后,后续删除操作将不会反映在数据缓存中,直到您尝试从已删除的行访问数据值。但是,将CacheSize设置为1可以消除此问题,因为无法提取已删除的行
不过,我100%确信我试图删除的记录尚未删除
但是,在定位之前进行重新同步可能会避免问题。可能重复@davidhefferan。在尝试删除记录之前,代码会检查记录是否仍然存在。所以这个错误不可能发生。我忘了提到,这是一个单用户设置,我编辑了这个问题来反映这一点。在我的代码中它看起来不像一个bug。@GerryColl那篇文章与Delphi5有关。我使用delphixe。这是Windows 8引入的一个新问题。抱歉,我在平板电脑上阅读,错过了XE参考。我建议测试一些边界条件,看看是否可以模拟它。例如,确保代码删除记录集中的第一条记录、最后一条记录,甚至可能是唯一的记录。