为什么不在TDataSet工作中使用DefaultExpression进行分解

时间:2018-02-09 20:00:26

标签: postgresql delphi firedac

我正在使用与PostgreSQL数据库相关的Delphi FireDac技术。我想在运行时为Field设置一个浮动值作为DefaultExpression。 下一行工作正常:

FDMemTable1.FieldByName( 'some_fieldname').FieldKind  := fkData;
FDMemTable1.FieldByName( 'some_fieldname').DefaultExpression := '5.5';

但是当我尝试用下一个代码解决这个问题时,我收到一个错误: 带有消息'[FireDAC] [Stan] [Eval] -104的异常类EFDException。在表达式中键入不匹配'。

procedure SetDefaultFieldValue (
    var aFDMemTable : TFDMemTable;
    aFieldName  : string;
    aFieldValue : string;
    aFieldKind  : TFieldKind );
  begin
    aFDMemTable.FieldByName( aFieldName ).FieldKind  := aFieldKind;
    aFDMemTable.FieldByName( aFieldName ).DefaultExpression :=  QuotedStr( aFieldValue );
  end;

我做错了什么?

感谢大家的建议。问题似乎是 - 正如@Graig Young指出的那样 - 不同类型的列(数字或字符串等)。 我需要字符串字段的 QuotedStr 。否则我收到错误:

  

[aFieldValue]找不到列或函数。加   FireDAC.Stan.ExprFuncs到uses子句(我有)

所以@Victoria,省略 QuotedStr 确实适用于数字字段,但像下一行那样的因子分析对字符串字段不起作用。

procedure SetDefaultFieldValue (
    var aFDMemTable : TFDMemTable;
    aFieldName  : string;
    aFieldValue : string;
    aFieldKind  : TFieldKind );
  begin
    aFDMemTable.FieldByName( aFieldName ).FieldKind  := aFieldKind;
    aFDMemTable.FieldByName( aFieldName ).DefaultExpression :=  aFieldValue;
  end;

DefaultExpression 需要字符串值。 试图改进我的问题: 是否可以将“任何”FieldType的DefaultExpression分解出来? 如果是这样,怎么样?

1 个答案:

答案 0 :(得分:0)

对于任何不清楚感到抱歉,但下一个代码可以避免上述错误。

procedure SetDefaultFieldValue(
    var aFDMemTable : TFDMemTable;
    aFieldName      : string;
    aFieldValue     : string;
    aFieldType      : TFieldType);
  begin
    aFDMemTable.FieldByName( aFieldName ).FieldKind  := fkData;

    case aFieldType of
      ftString  : aFDMemTable.FieldByName( aFieldName ).DefaultExpression :=  QuotedStr( aFieldValue ) ;
      ftSingle  : aFDMemTable.FieldByName( aFieldName ).DefaultExpression :=  aFieldValue ;
      ftInteger : aFDMemTable.FieldByName( aFieldName ).DefaultExpression :=  aFieldValue ;
    end;

  end;

正如@Graig Young所提到的,处理String-Fields的方式应该与Numeric-Fields不同。

现在下一个代码可以运行。

SetDefaultFieldValue( aAliasTable.FDMemTable1, 'some_fieldname', 'a_string_value' , ftString );
SetDefaultFieldValue( aAliasTable.FDMemTable1, 'another_fieldname', '5.5' , ftSingle );

感谢所有人!