“bof或eof为true或当前记录已被删除..”包含删除操作的applyupdates出错

时间:2009-12-07 12:07:32

标签: delphi tclientdataset tadodataset

我在解析从ClientDatset到TAdoDataset(绑定到访问表)的删除操作时遇到此错误。我正在使用Delphi 2010。

TClientDataset与TAdoDataset之间的我的数据集提供者:

object dspTarifeler: TDataSetProvider
  DataSet = DM.qryTarifeler    
  ResolveToDataSet = True
  Options = [poPropogateChanges, poUseQuoteChar]
end

此函数发生错误,由TDataSetResolver.EndUpdate()调用;

procedure TCustomADODataSet.InternalGotoBookmark(Bookmark: Pointer);
begin
  Recordset.Bookmark := POleVariant(Bookmark)^;
end;

4 个答案:

答案 0 :(得分:0)

我和TAdoDataset有同样的问题。没有发现它有什么问题,所以我只是在try中覆盖了方法,除了阻止。

试试这个:

TADODataset = class(ADODB.TADODataSet)
  public
    procedure InternalGotoBookmark(Bookmark: Pointer); override;
  end;

{ TADODataset }

procedure TADODataset.InternalGotoBookmark(Bookmark: Pointer);
begin
  try
    inherited InternalGotoBookmark(Bookmark);
  except

  end;
end;

答案 1 :(得分:0)

我不得不绕过提供程序并手动应用删除操作。它在调试模式下保持错误,但我可以忍受它。

procedure Tfrm.dspTarifelerBeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
  var Applied: Boolean);
begin
  if updatekind = ukDelete then
  begin
   if dm.qryTarifeler.Locate('Prefix',DeltaDs['Prefix'],[]) then
      dm.qryTarifeler.Delete;
   applied := true;
  end;
end;

答案 2 :(得分:0)

对于一些我无法猜测的无法解释的原因,我相信在删除之后,InternalGotoBookmark的书签参数将进入已删除的记录位置......

因此,Linas解决方案可以使事情发挥作用......

但我同意其他人的意见,吞下这个例外很糟糕......

答案 3 :(得分:0)

尝试设置

ResolveToDataSet = False