TClientDataSet过滤器是否有限制,还是一个bug?

时间:2016-03-15 17:05:44

标签: delphi delphi-xe datasnap tclientdataset

我使用lazy val commonSettings = Seq( name := "SampleSpray", version := "1.0", scalaVersion := "2.11.7", organization := "com.test" ) mainClass in assembly := Some("com.example.Boot") lazy val root = (project in file(".")). settings(commonSettings: _*). settings( name := "test", resolvers += "spray repo" at "http://repo.spray.io", libraryDependencies ++= { val akkaV = "2.3.9" val sprayV = "1.3.3" Seq( "io.spray" %% "spray-can" % sprayV, "io.spray" %% "spray-routing" % sprayV, "io.spray" %% "spray-json" % "1.3.2", "io.spray" %% "spray-testkit" % sprayV % "test", "com.typesafe.akka" %% "akka-actor" % akkaV, "com.typesafe.akka" %% "akka-testkit" % akkaV % "test", "org.specs2" %% "specs2-core" % "2.3.11" % "test", "com.sksamuel.elastic4s" %% "elastic4s-core" % "2.1.0", "com.sksamuel.elastic4s" %% "elastic4s-jackson" % "2.1.0", "net.liftweb" %% "lift-json" % "2.6+" ) } ) assemblyOption in assembly := (assemblyOption in assembly).value.copy(cacheUnzip = false) assemblyMergeStrategy in assembly := { case "BaseDateTime.class" => MergeStrategy.first } 作为内存表,并且必须应用具有大量条件的过滤器。

例如,在400 TClientDataSet条件下,当我尝试启用过滤器时,我收到了访问冲突。

  

模块'midas.dll'中地址4DAEDC76的访问冲突。读取地址00000034。

此处发生异常:

OR

它是组件上的错误还是midas.dll的限制? 我在这些midas版本上测试了这种行为:> = 15和< = 23

我正在使用Delphi XE。 示例代码:

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; 

我已经尝试过使用IN语句,但是我得到了同样的错误。

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

1 个答案:

答案 0 :(得分:5)

我可以重现此错误,包括&#34;读取地址00000034&#34;在Delphi西雅图。 当Filter表达式中有超过280个术语时,就会发生这种情况。它&#39; S 显然是midas限制。您需要一种更好的翻译问题域的方法 达到所需的过滤效果。

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