Поле TQuery Float неявно округляется до целого числа при использовании ODBC.

Я запрашиваю 1 значение из таблицы. В db это значение равно 48,8.

Когда мое приложение использует родной драйвер BDE Oracle SQL Link, все в порядке, оно по-прежнему 48,8.

Затем я заставляю приложение использовать другой псевдоним BDE, который использует источник данных ODBC (последний драйвер от Oracle). И теперь отображаемое значение равно 48,0.


Подробнее

Столбец factW NUMBER(10, 3).

Тестовый код:

var
  q: TQuery;
begin
  q := TQuery.Create( SELF );
  try
    q.DatabaseName := 'Realize';
    q.SQL.Text := 'SELECT factW, TO_CHAR(factW) charW'
                 +'FROM bSertific WHERE id_sertific = :id';
    q.ParamByName('id').AsInteger := dm1.Sertif1ID_SERTIFIC.AsInteger;
    q.Open;

    ShowMessage( ' factW = ' 
                 + FloatToStrF( 
                        q.FieldByName('factW').AsFloat, 
                        ffFixed, 
                        5, 3 )                                   // here 48.000
                 + ' charW = ' + q.FieldByName('charW').AsString // here 48.8
    );
  finally
    q.Free;
  end;
end;

person Alexander Malakhov    schedule 24.11.2011    source источник
comment
Вы знаете, что BDE считается устаревшим уже около десяти лет, не так ли? Нет никакой гарантии, что он будет работать с любым из драйверов ODBC, выпущенных примерно 10 лет назад, и решение проблем с какими-либо драйверами с тех пор маловероятно.   -  person Ken White    schedule 24.11.2011
comment
@Ken Я знаю, это устарело с 2002 года. Он старый и вызывает головную боль, и на самом деле я пытаюсь перейти на ODBC из-за некоторых проблем с BDE на Win7. При этом у меня возникла проблема сейчас, и переписать все приложения — дело не нескольких дней.   -  person Alexander Malakhov    schedule 24.11.2011
comment
Тогда не обновляйте драйвер Oracle. :) Эта проблема создавалась почти десять лет, и этого достаточно, чтобы она перестала быть проблемой. Если вы смогли настоять на том, чтобы ваши клиенты/клиенты/кто бы то ни было так долго проходили процесс установки и конфигурирования BDE, вы также можете попросить их некоторое время не обновлять клиент Oracle ODBC.   -  person Ken White    schedule 24.11.2011
comment
@Ken проблема проявляется только в Win7 (в XP все в порядке), поэтому раньше у клиентов не было проблем. Это должно быть исправлено сейчас. Моя единственная надежда заключается в том, что проблема связана с драйвером, а не с BDE. Переписать 15-летнее (дерьмовое) приложение Delphi 6 - это не то, о чем я мечтаю, знаете ли :) Тем более, что его планируется полностью переделать и переписать на Java EE в ближайшие 12-15 месяцев. Что-то быстрое и грязное было бы хорошо   -  person Alexander Malakhov    schedule 24.11.2011
comment
Извини. Не имеет значения, были ли у клиентов проблемы раньше. Не имеет значения и ваше отношение к переписыванию, и планы на будущее. «Что-то быстрое и грязное должно было начаться в 2001 году; после этого не так быстро, но намного грязнее. Быстро и грязно - сказать вашему клиенту не обновлять свои драйверы ODBC, пока вы не предоставите лучшую альтернативу, а затем вы разорите нашу заднюю часть, предоставив эту лучшую альтернативу.   -  person Ken White    schedule 24.11.2011


Ответы (1)


Я не нашел подходящего решения. Обходной путь — запросить поле как строку и преобразовать его туда и обратно на стороне клиента.

person Alexander Malakhov    schedule 05.02.2015