ошибка “либо bof, либо eof имеет значение true, либо текущая запись была удалена ..” при applyupdates, содержащая операцию удаления
-
13-09-2019 - |
Вопрос
Я получаю эту ошибку при разрешении операции удаления из ClientDatset в TADODataSet (которая привязана к таблице access).Я использую Delphi 2010.
Мой DataSetProvider между 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;
Решение 2
Мне пришлось обойти провайдера и применить операцию удаления вручную.это сохраняет ошибку в режиме отладки, но я могу с этим смириться.
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;
Другие советы
У меня была такая же проблема с TADODataSet.Не нашел, что с этим не так, поэтому я просто переопределил метод в блоке try except.
Попробуй это:
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;
По какой-то необъяснимой причине, о которой я не могу догадаться, я полагаю, что после удаления параметр закладки InternalGotoBookmark переходит в позицию удаленной записи...
Таким образом, решение Linas заставило бы эту штуку работать...
Но я согласен с другими, проглатывать исключение - это плохо....
Попробуйте установить
ResolveToDataSet = False