【发布时间】:2025-11-23 00:10:02
【问题描述】:
我使用TClientDataSet 作为内存表,并且必须应用具有很多条件的过滤器。
例如,对于 400 个OR 条件,我在尝试启用过滤器时遇到访问冲突。
模块“midas.dll”中地址 4DAEDC76 的访问冲突。读取地址 00000034。
这里发生异常:
procedure TCustomClientDataSet.AddExprFilter(const Expr: Widestring; Options: TFilterOptions);
begin
if FExprFilter <> nil then FDSCursor.DropFilter(FExprFilter);
if Expr <> '' then
with TExprParser.Create(Self, Expr, Options, [poExtSyntax], '', nil, FieldTypeMap, True) do
try
CheckProviderEOF;
Check(FDSCursor.AddFilter(FilterData, DataSize, FExprFilter)); // ** AV HERE
finally
Free;
end;
end;
这是组件上的错误还是 midas.dll 的限制? 我在这些 midas 版本上测试了这种行为:>= 15 和
我正在使用 Delphi XE。 示例代码:
procedure TForm41.Button1Click(Sender: TObject);
var
I: Integer;
FilterStr: string;
begin
FilterStr := '(vehicleId = -1)';
//It is just an example, the original code I can have any integer number.
for I := 0 to 400 do //If I change the limit value to 40 for example, it works.
FilterStr := FilterStr + ' or (vehicleId = ' + IntToStr(I) + ')';
ClientDataSet1.Filter := FilterStr;
ClientDataSet1.Filtered := True;
ClientDataSet1.CreateDataSet; //Error here
end;
我已经尝试过使用 IN 语句,但我得到了同样的错误。
我没有在互联网上找到关于这种情况的参考资料。
【问题讨论】:
-
你得到什么异常?为什么您可能需要添加 400 OR 条件?如果你不得不这样做,那你就做错了。如果您需要过滤那么多,请在主数据集中或使用
TClientDataSet.OnFilterRecord事件进行。 -
遗留代码 Ken White,如果不进行大量修改,我可以轻松更改任何内容。这是一个权限过滤器,用户可以看到 400 辆车。
-
您可以使用
OnFilterRecord,无需进行重大修改。你还没有指出你得到了什么异常。您看到了什么确切异常消息? -
我一般访问冲突,我跟踪代码:它发生在这一行:Check(FDSCursor.AddFilter(FilterData, DataSize, FExprFilter));即:procedure TCustomClientDataSet.AddExprFilter(const Expr: Widestring; Options: TFilterOptions);如果 FExprFilter nil 则开始 FDSCursor.DropFilter(FExprFilter); if Expr '' then with TExprParser.Create(Self, Expr, Options, [poExtSyntax], '', nil, FieldTypeMap, True) 试试 CheckProviderEOF; Check(FDSCursor.AddFilter(FilterData, DataSize, FExprFilter));终于免费了;结尾;结束;
-
我相信我从未见过除了General Access Violation 之外什么都不说的Delphi 异常。对于第三次,您看到的确切错误消息是什么?不是我看到类似的东西,而是确切的错误消息,包括内存地址。
标签: delphi delphi-xe datasnap tclientdataset