Ans*_*oMS 1 delphi macros firedac
我有以下 SQL 命令来运行TFDQuery使用 PostgreSQL 作为数据库的查询:
fdqr.SQL.Text: =
'select * from (values (current_date-1), (current_date), (current_date + 1)) as t (datetest) ' +
'{iif (! Datevalue, where datetest =! Datevalue)}';
Run Code Online (Sandbox Code Playgroud)
当我使用该Clear方法清除宏值时,我希望解释脚本以便消除过滤器,但事实并非如此。
fdqr.MacroByName('datevalue').Clear;
fdqr.Open;
Run Code Online (Sandbox Code Playgroud)
结果数据库日志:
fdqr.SQL.Text: =
'select * from (values (current_date-1), (current_date), (current_date + 1)) as t (datetest) ' +
'{iif (! Datevalue, where datetest =! Datevalue)}';
Run Code Online (Sandbox Code Playgroud)
但是,如果您通过 包含赋值AsRaw,它会按预期工作,即使先前的值是''(空字符串)并且IsNull是True。
fdqr.MacroByName('datevalue').Clear;
{ at this point IsNull = True and AsRaw is '' }
fdqr.MacroByName('datevalue').AsRaw := '';
fdqr.Open;
Run Code Online (Sandbox Code Playgroud)
结果数据库日志:
fdqr.MacroByName('datevalue').Clear;
fdqr.Open;
Run Code Online (Sandbox Code Playgroud)
这是 FireDAC 错误还是我没有正确理解的功能?
为了应用宏变量的替换{IIF(…)}或{IF}…{FI}基于宏变量,变量值不能为空。这就是有条件替换的文档所说的。它的字面意思是,如果宏变量扩展为非空字符串,则应用替换。这个事实可以通过检查 FireDAC 源代码来验证,特别TFDPhysConnectionMetadata.TranslateEscapeSequence是 unit 中的方法FireDAC.Phys.Meta。如果eskIF您可以找到:
s := Trim(ASeq.FArgs[0]);
…
else if s <> '' then
Result := 'True';
Run Code Online (Sandbox Code Playgroud)
让我们看看当您Clear使用宏变量时会发生什么。它Value被设置为Null并且它DataType被设置为mdUnknown。在这种情况下,变量被NULL预处理器扩展为文字,它不是空字符串。的值AsRaw无关紧要,因为预处理器使用SQL属性进行替换。
除了设置之外,似乎没有其他方法可以将宏变量扩展为空字符串AsRaw := ''。在这种情况下,它DataType被设置为mdRaw并且 valueSQL属性等于AsRaw。
我不确定这种行为是错误还是特性,但改变它可能会破坏现有的代码库,所以我不希望这会被修复。我宁愿说它最终成为了一个功能。
除了上述之外,您可以通过使用简单的参数来避免宏:
s := Trim(ASeq.FArgs[0]);
…
else if s <> '' then
Result := 'True';
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以Datevalue按预期清除或设置参数的值:
{ to bind null value }
fdqr.ParamByName('Datevalue').Clear;
{ to bind some value }
fdqr.ParamByName('Datevalue').AsDate := Today;
Run Code Online (Sandbox Code Playgroud)