Delphi 6 с ADO + Oracle возвращает NUMBER с разной точностью, что приводит к переполнению BCD.

У меня проблема с Delphi 6 + Oracle 10gR2 + ADO + ClientDataSet.

Всякий раз, когда я запускаю агрегатную функцию для поля NUMBER(19,9), результирующий столбец возвращает тип данных NUMBER в Delphi, а на некоторых машинах он загружается как TBCDField с точностью 38, и все идет хорошо, но на некоторых машинах он загружается как TBCDField с точностью 255, и я получаю переполнение поля BCD.

Чтобы повторить проблему, просто создайте таблицу со столбцом NUMBER (19,9) и запустите SELECT SUM(column_name) column_name FROM table_name СГРУППИРОВАТЬ ПО имя_столбца.

Несмотря на то, что столбец представляет собой ЧИСЛО (19,9), результирующий столбец будет ЧИСЛОМ без определенной точности.

В Delphi загрузите запрос в ADOQuery со связанным с ним DataSetProvider и ClientDataSet, связанным с DataSetProvider. После вызова ClientDataSet.Open на некоторых машинах я получаю сообщение о переполнении BCD в поле NUMBER, но на многих машинах это работает хорошо.

Почему я получаю эту точность 255 на некоторых машинах, когда midas.dll, ADO, сервер, пользователь, клиент оракула одинаковы на обеих машинах? Любые идеи?


person Pascal    schedule 17.07.2009    source источник


Ответы (2)


Попробуйте тип приведения

Select **CAST(NUMBER_FLD as VARCHAR2(15))** as NUMBER_FLD from DUAL;

В Delphi это компонент StringField (ClientDataset), но если вы получаете псевдоним, например, CdsOracleSQL.FieldByname('NUMBER_FLD').AsFloat или CdsOracleSQLNUMBER_FLD.AsFloat работает.

Я не знаю, почему BCDField теряет десятичный разделитель и работает как целое число...

person Hangout    schedule 15.05.2014

У меня нет однозначного ответа на ваш вопрос, но уверены ли вы, что у вас одинаковые версии клиентских dll на обеих машинах? Возможно, установлено другое программное обеспечение, которое мешает. Попробуйте запустить Windows Process Explorer на клиентских компьютерах и убедитесь, что библиотеки dll вы думаете, что используете те, которые на самом деле используются вашими клиентскими приложениями.

person Steve Broberg    schedule 17.07.2009
comment
Я попробую использовать Process Explorer. Хорошая идея. Но на обеих машинах один и тот же клиент, я уверен - person Pascal; 18.07.2009