Delphi:使用数据库中的 BigInts

发布于 2024-08-03 16:46:52 字数 337 浏览 5 评论 0原文

我使用 Delphi 7devart dbExpress 连接到 SQLServer。 问题是,当我将 bigInt 字段添加到 ClientQuery 时,它会显示为 TFMTBCDField

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

我可以使用 Field.AsVariant 或 StrToInt64(Field.AsString) 来选择这个 64 位值。

有没有更好的方法来选择/使用这个值?

I´m using Delphi 7 with devart dbExpress to connect to SQLServer.
The problem is that when I add a bigInt field to a ClientQuery it comes as TFMTBCDField.

And the TFMTBCDField don´t have a method to get the 64 bit value.

I can use the Field.AsVariant or the StrToInt64(Field.AsString) to pick this 64 bits value.

Is there a better way to pick/use this value?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

同展鸳鸯锦 2024-08-10 16:46:52

也许手动添加一个 TLargeIntField 到数据集,将其 FieldName 设置为适当的名称并使用这样的代码:

SomeInt64Value := (qryMyQuery.FieldByName('blahblah') as TLargeIntField).AsLargeInt;

不记得确切的类型,但它在 Delphi6 中是这样工作的。

Maybe add a TLargeIntField manualy to dataset, set it's FieldName to appropriate name and use such code:

SomeInt64Value := (qryMyQuery.FieldByName('blahblah') as TLargeIntField).AsLargeInt;

Do not remember exactly types, but it worked this way in Delphi6.

千年*琉璃梦 2024-08-10 16:46:52

您可以使用 VarFMTBcdCreate 从单元 FMTBcd 将 BCD 转换为 Variant,然后转换为 int64。

试试这个:

var value64 : int64;
...
value64 := VarFMTBcdCreate(Field.Value);

You can convert the BCD to Variant and than to int64 with VarFMTBcdCreate from unit FMTBcd.

Try this:

var value64 : int64;
...
value64 := VarFMTBcdCreate(Field.Value);
随风而去 2024-08-10 16:46:52

TFMTBCDField 的数据格式是来自 FMTBcd 单元的 TBcd 记录。您可以通过读取字段的 ValueAsBCD 属性来获取该原始值。

根据您需要的值,TBcd 可能就足够了。也就是说,您可能不需要将其转换为 Int64FMTBcd 单元提供对 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。因此,您对字段的字符串版本调用 StrToInt64 的想法似乎没问题。

The data format for TFMTBCDField is the TBcd record from the FMTBcd unit. You can get that raw value by reading the field's Value or AsBCD properties.

Depending on what you need the value for, TBcd might be sufficient. That is, you might not need to convert it to an Int64. The FMTBcd unit provides functions to add, subtract, multiply, and divide TBcd values.

The unit provides no conversions to Int64. There are conversions to Variant, string, Currency, Double, and Integer. If we were going to write an Int64 conversion, the Integer conversion is probably a good place to start, so let's take a look at how it's implemented:

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;

So, the VCL itself doesn't provide any more direct way to convert a TBcd to an Integer than to go through string. Therefore, it looks like your idea to call StrToInt64 on the string version of the field is fine.

撩动你心 2024-08-10 16:46:52

我这里不再安装 Delphi 7,但是在帮助中,我看到你可以得到 Float (Double),如下所示:

function GetFieldAsInt64(Field: TField): Int64;
begin
  Result:= Int64(Round(Field.GetAsFloat));
end;

然后,调用该函数:

var
  Value: Int64;
begin
  Value:= GetFieldAsInt64(MyFMTBCDField);

end;

I dont have Delphi 7 installed here anymore, but looking in the help, I see you can get as Float (Double), like this:

function GetFieldAsInt64(Field: TField): Int64;
begin
  Result:= Int64(Round(Field.GetAsFloat));
end;

And then, call the function:

var
  Value: Int64;
begin
  Value:= GetFieldAsInt64(MyFMTBCDField);

end;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文