我使用Delphi 7
与devart dbExpress
连接到SQLServer
。 问题是,当我添加一个bigInt
字段到ClientQuery
它来作为TFMTBCDField
。德尔福:从数据库使用BigInts
而且TFMTBCDField
没有获得64位值的方法。
我可以使用Field.AsVariant
或StrToInt64(Field.AsString)
来选择这个64位的值。
有没有更好的方法来选择/使用此值?
我使用Delphi 7
与devart dbExpress
连接到SQLServer
。 问题是,当我添加一个bigInt
字段到ClientQuery
它来作为TFMTBCDField
。德尔福:从数据库使用BigInts
而且TFMTBCDField
没有获得64位值的方法。
我可以使用Field.AsVariant
或StrToInt64(Field.AsString)
来选择这个64位的值。
有没有更好的方法来选择/使用此值?
也许manualy添加TLargeIntField到数据集,设置它的字段名,以适当的名称,并使用这样的代码:
SomeInt64Value := (qryMyQuery.FieldByName('blahblah') as TLargeIntField).AsLargeInt;
不记得确切的类型,但它的工作本在Delphi6中的方式。
我没有德尔福7这里安装了,但看在帮忙,我看你能得到为Float(双人间),像这样:
function GetFieldAsInt64(Field: TField): Int64;
begin
Result:= Int64(Round(Field.GetAsFloat));
end;
,然后调用函数:
var
Value: Int64;
begin
Value:= GetFieldAsInt64(MyFMTBCDField);
end;
一个double不能提供足够的有效数字(15-16)来存储一个64位整数(最大int64为19位) – 2009-09-01 06:48:39
@ The Fox:我检查了Delphi 2010的源代码,并且是如何完成的。 – 2009-09-01 09:23:18
为了您的方便,它们可能会提供GetAsFloat,但TFMTBCDField比Double可以提供更高的精度。 – 2009-09-01 10:12:22
您可以将BCD转换为Variant,并将其转换为int64,并使用单元FMTBcd的VarFMTBcdCreate。
试试这个:
var value64 : int64;
...
value64 := VarFMTBcdCreate(Field.Value);
这仍然使用变体 – 2009-09-02 01:52:38
添加变量声明以清除 – 2009-09-02 08:36:29
Matthias,变量声明根本没有解决Gerry的注释。 'VarFMTBcdCreate'返回一个'Variant'类型的值。赋值语句然后将该'Variant'转换为'Int64'。 – 2009-09-03 03:05:35
TFMTBCDField
的数据格式是来自FMTBcd单位的TBcd
记录。您可以通过阅读该字段的Value
或AsBCD
属性来获取该原始值。
根据您需要的值,TBcd
可能就足够了。也就是说,您可能不需要将其转换为Int64
。该单元提供用于加,减,乘和除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本身不提供任何更直接将TBcd
转换为Integer
的方法,而不是经过string
。因此,看起来你的想法是在字段的字符串版本上调用StrToInt64
很好。
我为'TFMTBCDField'字段使用'Int64Var:= StrToInt64(Field.AsString)',它工作正常。换句话说,我使用'Field.AsFMTBCD:= StrToBcd(IntToStr(Int64Var))' – 2015-01-10 01:18:57
是否简单地将另一个字段添加到与自动添加的数据集不同类型的数据集中?我的意思是,驱动程序会发送与新字段类型兼容的数据,还是驱动程序会继续发送BCD数据,而字段对象只是将该字节块解释为Int64?无论如何,**如果**完全允许,则不需要将类型转换为'TLargeintField'; AsLargeInt属性获取器是虚拟的,因此即使直接调用“TField”值,也会使用正确的代码。 – 2009-09-03 05:43:51
我不知道这是否是犹太教。可能这是强烈依赖于特定的TDataSet实现。顺便说一下,类型转换是delphi6和之前的唯一选项,因为qryMyQuery.FieldByName('blahblah')。AsLargeints不允许(TField没有AsLargeint属性)。 – smok1 2009-09-03 06:27:40