繁体   English   中英

Delphi:使用数据库中的BigInts

[英]Delphi: using BigInts from a database

我使用Delphi 7devart dbExpress连接到SQLServer 问题是,当我添加一个bigInt字段添加到ClientQuery它作为TFMTBCDField

并且TFMTBCDField没有获取64位值的方法。

我可以使用Field.AsVariantStrToInt64(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记录。 您可以通过读取字段的ValueAsBCD属性来获取该原始值。

根据您需要的值, TBcd可能就足够了。 也就是说,您可能不需要将其转换为Int64 FMTBcd单元提供添加,减去,乘法和除法TBcd值的函数。

该单元不提供Int64转换。 转换为VariantstringCurrencyDoubleInteger 如果我们要编写一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM