2009-09-01 3 views
4

Delphi 7devart dbExpress을 사용하여 SQLServer에 연결했습니다. 문제는 ClientQuerybigInt 필드를 추가하면 TFMTBCDField이됩니다.델파이 : 데이터베이스에서 BigInts 사용하기

그리고 TFMTBCDField 본건은 64 비트 값을 얻을 수있는 방법이있다.

Field.AsVariant 또는 StrToInt64(Field.AsString)을 사용하여이 64 비트 값을 선택할 수 있습니다.

이 값을 선택/사용하는 더 좋은 방법이 있습니까?

답변

4

어쩌면 데이터 세트에 수동으로 실시 TLargeIntField을 추가하고 같은 코드를 사용 :

이 시도

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

정확히 유형을 기억하지 마십시오,하지만이 일을 델파이 6에서.

+0

자동으로 추가 된 것과 다른 유형의 데이터 집합에 다른 필드를 간단하게 추가하는 것이 합리적입니까? 내 말은, 드라이버가 새로운 필드 유형과 호환되는 데이터를 보내거나 드라이버가 BCD 데이터를 계속 전송하고 필드 객체가 해당 블록을 Int64로 대신 해석한다는 것입니까? 어쨌든, ** 가능하다면 ** TLargeintField 로의 타입 캐스트는 필요하지 않습니다; AsLargeInt 프라퍼티 getter는 가상이므로 올바른 코드는 TField 값에서 직접 호출 될 때에도 사용됩니다. –

+0

나는 이것이 정결한지 알지 못한다. 아마도 이것은 특정 TDataSet 구현에 크게 의존합니다. 그리고 그런데 - typecasting은 delphi6 이전에는 qryMyQuery.FieldByName ('blahblah') 이후 유일한 옵션이었습니다. AsLargeint는 허용되지 않았습니다 (TField에는 AsLargeint 속성이 없었습니다). – smok1

-1

내가 델파이 7이 더 이상 여기에 설치 해달라고하지만, 도움을보고, 나는 이런 식으로, 당신은 플로트 (더블)으로 얻을 수 있습니다 참조 :

: 다음

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

과, 함수를 호출

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

end; 
+0

double은 64 비트 정수 (최대 int64의 경우 19 자리)를 저장할 수있는 유효 숫자 (15-16)를 제공하지 않습니다. –

+0

@ The Fox : 델파이의 새 버전에는 문제가 생길 수 있습니다. 델파이 2010 소스를 확인하고 이것이 어떻게 수행되는지를 확인합니다. –

+0

아마도 귀하의 편의를 위해 GetAsFloat를 제공하지만, TFMTBCDField는 Double이 제공하는 것보다 더 높은 정밀도를 제공합니다. –

0

당신은 단위 FMTBcd에서 VarFMTBcdCreate와 INT64하는 변형과보다 BCD 변환 할 수 있습니다. 그것은 적절한 이름에 필드 이름을의 설정,

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

여전히 Variant를 사용합니다. –

+0

변수 선언을 추가하여 명확하게합니다. –

+0

Matthias, 변수 선언은 Gerry의 주석을 전혀 다루지 않습니다. 'VarFMTBcdCreate'는'Variant' 타입의 값을 반환합니다. 할당 문은 그 '변형'을 'Int64'로 변환합니다. –

0

TFMTBCDField의 데이터 형식은 FMTBcd 단위의 TBcd 레코드입니다. 필드의 Value 또는 AsBCD 속성을 읽어 원시 값을 얻을 수 있습니다.

값이 필요한 항목에 따라 TBcd이면 충분할 수 있습니다. 즉, Int64으로 변환하지 않아도됩니다. FMTBcd 단위는 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으로 변환하는 것입니다. 따라서 필드의 문자열 버전에 StrToInt64을 호출하는 것이 좋습니다.

+0

'TFMTBCDField' 필드에'Int64Var : = StrToInt64 (Field.AsString)'을 사용하면 정상적으로 작동합니다. 다른 방법으로, 나는'Field.AsFMTBCD : = StrToBcd (IntToStr (Int64Var))'를 사용한다. –

관련 문제