[英]Delphi: using BigInts from a database
我使用Delphi 7
和devart dbExpress
连接到SQLServer
。 问题是,当我添加一个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
的数据格式是FMTBcd单元的TBcd
记录。 您可以通过读取字段的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本身不提供将TBcd
转换为Integer
不是通过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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.