Delphi 6 с ADO + Oracle возвращает NUMBER с различной точностью, вызывая переполнение BCD - PullRequest
1 голос
/ 18 июля 2009

У меня проблема с 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 GROUP BY имя_ столбца .

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

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

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

Ответы [ 2 ]

1 голос
/ 15 мая 2014

Попробуйте набрать тип

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

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

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

0 голосов
/ 18 июля 2009

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

...