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(имя_ столбца) имя_ столбца ОТ имя_группы GROUP BY имя_ столбца.

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

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

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

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 теряет десятичный разделитель и работает как целое число...

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

Другие вопросы по тегам