我正在使用Delphi 7withdevart dbExpress连接到SQLServer. 问题是当我向 a 添加一个bigInt字段时,ClientQuery它是TFMTBCDField.
并且TFMTBCDField没有获得 64 位值的方法。
我可以使用Field.AsVariant或StrToInt64(Field.AsString)来选择这个 64 位值。
有没有更好的方法来选择/使用这个值?
我正在使用Delphi 7withdevart dbExpress连接到SQLServer. 问题是当我向 a 添加一个bigInt字段时,ClientQuery它是TFMTBCDField.
并且TFMTBCDField没有获得 64 位值的方法。
我可以使用Field.AsVariant或StrToInt64(Field.AsString)来选择这个 64 位值。
有没有更好的方法来选择/使用这个值?
也许手动添加一个 TLargeIntField 到数据集,将它的 FieldName 设置为适当的名称并使用这样的代码:
SomeInt64Value := (qryMyQuery.FieldByName('blahblah') as TLargeIntField).AsLargeInt;
不记得确切的类型,但它在 Delphi6 中以这种方式工作。
您可以使用来自单元 FMTBcd 的 VarFMTBcdCreate 将 BCD 转换为 Variant,而不是转换为 int64。
试试这个:
var value64 : int64;
...
value64 := VarFMTBcdCreate(Field.Value);
的数据格式TFMTBCDField是TBcd来自FMTBcd单元的记录。您可以通过读取字段的Value或AsBCD属性来获得该原始值。
根据您需要的价值,TBcd可能就足够了。也就是说,您可能不需要将其转换为Int64. FMTBcd单元提供加、减、乘和除值TBcd的功能。
该单位不提供到Int64. 有到Variant、string、Currency、Double和的转换Integer。如果我们要写一个Int64转换,Integer转换可能是一个很好的起点,所以让我们看看它是如何实现的:
function BcdToInteger(const Bcd: TBcd; Truncate: Boolean = False): Integer;
var
ABcd: TBcd;
begin
if Truncate and (BcdScale(Bcd) > 0) then
NormalizeBcd(Bcd, ABcd, Bcd.Precision, 0)
else
ABcd := Bcd;
Result := StrToInt(BcdToStr(ABcd));
end;
因此,VCL 本身并没有提供任何更直接的方式来将 a 转换TBcd为 anInteger而不是通过string. 因此,看起来您调用StrToInt64该字段的字符串版本的想法很好。
我没有在这里安装 Delphi 7,但是在帮助中,我看到你可以得到 Float (Double),像这样:
function GetFieldAsInt64(Field: TField): Int64;
begin
Result:= Int64(Round(Field.GetAsFloat));
end;
然后,调用函数:
var
Value: Int64;
begin
Value:= GetFieldAsInt64(MyFMTBCDField);
end;