2009-09-01 65 views
4

我使用Delphi 7devart dbExpress连接到SQLServer。 问题是,当我添加一个bigInt字段到ClientQuery它来作为TFMTBCDField德尔福:从数据库使用BigInts

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

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

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

回答

4

也许manualy添加TLargeIntField到数据集,设置它的字段名,以适当的名称,并使用这样的代码:

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

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

+0

是否简单地将另一个字段添加到与自动添加的数据集不同类型的数据集中?我的意思是,驱动程序会发送与新字段类型兼容的数据,还是驱动程序会继续发送BCD数据,而字段对象只是将该字节块解释为Int64?无论如何,**如果**完全允许,则不需要将类型转换为'TLargeintField'; AsLargeInt属性获取器是虚拟的,因此即使直接调用“TField”值,也会使用正确的代码。 – 2009-09-03 05:43:51

+0

我不知道这是否是犹太教。可能这是强烈依赖于特定的TDataSet实现。顺便说一下,类型转换是delphi6和之前的唯一选项,因为qryMyQuery.FieldByName('blahblah')。AsLargeints不允许(TField没有AsLargeint属性)。 – smok1 2009-09-03 06:27:40

-1

我没有德尔福7这里安装了,但看在帮忙,我看你能得到为Float(双人间),像这样:

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

,然后调用函数:

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

end; 
+0

一个double不能提供足够的有效数字(15-16)来存储一个64位整数(最大int64为19位) – 2009-09-01 06:48:39

+0

@ The Fox:我检查了Delphi 2010的源代码,并且是如何完成的。 – 2009-09-01 09:23:18

+0

为了您的方便,它们可能会提供GetAsFloat,但TFMTBCDField比Double可以提供更高的精度。 – 2009-09-01 10:12:22

0

您可以将BCD转换为Variant,并将其转换为int64,并使用单元FMTBcd的VarFMTBcdCreate。

试试这个:

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

这仍然使用变体 – 2009-09-02 01:52:38

+0

添加变量声明以清除 – 2009-09-02 08:36:29

+0

Matthias,变量声明根本没有解决Gerry的注释。 'VarFMTBcdCreate'返回一个'Variant'类型的值。赋值语句然后将该'Variant'转换为'Int64'。 – 2009-09-03 03:05:35

0

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

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

本机不提供转换为Int64。有转换为Variant,string,Currency,DoubleInteger。如果我们要编写一个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很好。

+0

我为'TFMTBCDField'字段使用'Int64Var:= StrToInt64(Field.AsString)',它工作正常。换句话说,我使用'Field.AsFMTBCD:= StrToBcd(IntToStr(Int64Var))' – 2015-01-10 01:18:57