我正在使用Delphi 7
withdevart dbExpress
连接到SQLServer
. 问题是当我向 a 添加一个bigInt
字段时,ClientQuery
它是TFMTBCDField
.
并且TFMTBCDField
没有获得 64 位值的方法。
我可以使用Field.AsVariant
或StrToInt64(Field.AsString)
来选择这个 64 位值。
有没有更好的方法来选择/使用这个值?
我正在使用Delphi 7
withdevart 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;