TCustomADODataSet.FilterOnBookmarks
我有一个老的应用程序,总是工作正常。最近它开始抛出方法FilterOnBookmarks中的EAccessViolation异常。我不知道它何时开始,也许我在XE 10.1下重建它。TCustomADODataSet.FilterOnBookmarks
procedure TCustomADODataSet.FilterOnBookmarks(Bookmarks: array of const);
var
I: Integer;
BookmarkData: OleVariant;
begin
CheckBrowseMode;
BookmarkData := VarArrayCreate([Low(Bookmarks), High(Bookmarks)], varVariant);
for I := Low(Bookmarks) to High(Bookmarks) do
BookmarkData[I] := POleVariant(TVarRec(Bookmarks[I]).VPointer)^;
inherited SetFilterText('');
FFilterGroup := fgUnassigned;
DestroyLookupCursor;
try
Recordset.Filter := BookmarkData; //<---- Here I get EAccessViolation
First;
inherited SetFiltered(True);
except
inherited SetFiltered(False);
raise;
end;
end;
创建FilterOnBookamrks方法的书签参数作为TVarRec的数组:
type TSQLVarRecArray = array of TVarRec;
PBookmark = ^TBookmark;
TSQLBookmarkList = class(TList)
private
...
protected
function Get(Index: Integer): PBookmark;
public
...
procedure Add(Bookmark: TBookmark);
property Items[Index: Integer]: PBookmark read Get; default;
function ToVarRecArray: TSQLVarRecArray;
end;
procedure TSQLBookmarkList.Add(Bookmark: TBookmark);
var PB: PBookmark;
L: Integer;
begin
New(PB);
L := Length(Bookmark);
SetLength(PB^, L);
PB^ := Copy(Bookmark, 0, L);
inherited Add(PB);
end;
function TSQLBookmarkList.ToVarRecArray: TSQLVarRecArray;
var I: Integer;
begin
SetLength(Result, Count);
for I := 0 to Count - 1 do begin
Result[I].VType := vtPointer;
Result[I].Vpointer := Items[I]^;
end;
end;
try
...
Arr := BookmarkList.ToVarRecArray;
FilterOnBookmarks(Arr);
finally
Arr := nil; //<--- Now I get here EVariantArrayLockedError "Variant or safe array is locked"
end;
该代码已经工作了多年。 10.1 XE中关于FilterOnBookmarks,Bookmarks等有什么变化?
问题不在Delphi中。 我们有同样的问题。 请参阅:https://answers.microsoft.com/en-us/windows/forum/windows_7-update/windows-10-update-kb4015217-windows-7-update/d6ee5ee8-a362-48fd-be1d-26a6b6526c34 最近升级后,问题出在, C:\ Program Files(x86)\ Common Files \ System \ ado \ msado15.dll 。 如果您将升级前的msado15.dll替换为该应用程序,则该应用程序可以正常运行。
我们暂时解决了这个问题。 我们用 替换了msado15.dll C:\ Program Files(x86)\ Common Files \ System \ ado 我们从未升级的计算机中取得msado15.dll。
非常感谢,@ user3648935! –
您是否找到解决方案? (无需更改应用程序) 我们遇到同样的问题,我们无法更改应用程序。 谢谢 – user3648935
谢谢@ user3648935!将旧版本的msado15.dll放到应用程序工作目录中是否可以解决问题?我在哪里可以找到它? –