Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi EOleException:BOF或EOF为真,或者当前记录已被删除。请求的操作需要当前记录_Delphi_Ado_Delphi Xe - Fatal编程技术网

Delphi 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上发生。

我得到一个例外:

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

正在尝试删除记录:

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参考。我建议测试一些边界条件,看看是否可以模拟它。例如,确保代码删除记录集中的第一条记录、最后一条记录,甚至可能是唯一的记录。