Delphi: использование BigInts из базы данных - PullRequest
4 голосов
/ 01 сентября 2009

Я использую Delphi 7 с devart dbExpress для подключения к SQLServer. Проблема в том, что когда я добавляю поле bigInt к ClientQuery, оно выглядит как TFMTBCDField.

И у TFMTBCDField нет метода для получения 64-битного значения.

Я могу использовать Field.AsVariant или StrToInt64(Field.AsString), чтобы выбрать это 64-битное значение.

Есть ли лучший способ выбрать / использовать это значение?

Ответы [ 4 ]

4 голосов
/ 01 сентября 2009

Может быть, добавить TLargeIntField вручную в набор данных, установить для его FieldName подходящее имя и использовать такой код:

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

Не помню точно типов, но в Delphi6 это работало так.

0 голосов
/ 03 сентября 2009

Формат данных для TFMTBCDField - это запись TBcd с устройства FMTBcd . Вы можете получить это необработанное значение, прочитав Value или AsBCD свойства поля.

В зависимости от того, для чего вам нужно значение, TBcd может быть достаточным. То есть вам может не потребоваться преобразовать его в Int64. FMTBcd предоставляет функции для сложения, вычитания, умножения и деления 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 в строковой версии поля - это нормально.

0 голосов
/ 01 сентября 2009

Вы можете преобразовать BCD в Variant, а затем в int64 с помощью VarFMTBcdCreate из модуля FMTBcd.

Попробуйте это:

var value64 : int64;
...
value64 := VarFMTBcdCreate(Field.Value);
0 голосов
/ 01 сентября 2009

У меня здесь больше не установлен Delphi 7, но, глядя в справку, я вижу, что вы можете получить как Float (Double), например:

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

А затем вызвать функцию:

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

end;
...