5

我正在使用Delphi 7withdevart dbExpress连接到SQLServer. 问题是当我向 a 添加一个bigInt字段时,ClientQuery它是TFMTBCDField.

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

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

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

4

4 回答 4

4

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

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

不记得确切的类型,但它在 Delphi6 中以这种方式工作。

于 2009-09-01T13:19:54.043 回答
0

您可以使用来自单元 FMTBcd 的 VarFMTBcdCreate 将 BCD 转换为 Variant,而不是转换为 int64。

试试这个:

var value64 : int64;
...
value64 := VarFMTBcdCreate(Field.Value);
于 2009-09-01T07:26:32.233 回答
0

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

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

该单位不提供到Int64. 有到VariantstringCurrencyDouble和的转换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该字段的字符串版本的想法很好。

于 2009-09-03T05:36:58.990 回答
-1

我没有在这里安装 Delphi 7,但是在帮助中,我看到你可以得到 Float (Double),像这样:

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

然后,调用函数:

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

end;
于 2009-09-01T05:18:22.600 回答