gpt4 book ai didi

delphi - TClientDataSet 过滤器是否有限制,或者是一个错误?

转载 作者:行者123 更新时间:2023-12-03 15:26:41 28 4
gpt4 key购买 nike

我使用 TClientDataSet 作为内存表,并且必须应用具有很多条件的过滤器。

例如,对于 400 个 OR 条件,当我尝试启用过滤器时遇到访问冲突。

Access violation at address 4DAEDC76 in module 'midas.dll'. Read of address 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 和 <= 23

我正在使用 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 语句,但遇到了同样的错误。

我在互联网上没有找到有关这种情况的引用资料。

最佳答案

我可以重现此错误,包括 Delphi Seattle 中的“读取地址 00000034”。当过滤器表达式中的项超过约 280 个时,就会发生这种情况。它是显然是迈达斯的限制。您需要一种更好的方法来转换您的问题域达到过滤器所需的效果。

如果您可以在代码中评估您的条件,那么我要做的就是添加将 bool 值 fkInternalCalc 字段添加到 CDS 并将其设置为 True 或 False取决于结果。然后,过滤数据集就很简单了基于 bool 值应用过滤器。

关于delphi - TClientDataSet 过滤器是否有限制,或者是一个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36017698/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com