我正在使用与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分解出来? 如果是这样,怎么样?
答案 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 );
感谢所有人!