我使用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