2014-11-24 13 views
1

Запись 0.001 в Postgres (9.1 по 9.3) с помощью адаптера данных .net приводит к странному значению 0.00 (в pgAdmin), которое отображается как ноль, но является не.Запись 0.001 в Postgres 9.x через данные адаптера приводит к странному 0,00-значению

На самом деле простые запросы, такие как SELECT 1/(SELECT "weird_field" ...) FROM ... correctcly дает 1000.

Более сложные запросы (с разделением) на удивление приводят к ошибке division by zero.

Кроме того, заказ на в Navicat правильно показывает те значения между 0,0011 и 0,0009

enter image description here

Мы используем библиотеки DevArt для подключения к базе данных, но преступник, кажется, адаптер данных (или по крайней мере, комбо из этих двух), потому что простой прямой запрос, все еще через драйверы Devart, не дает того же результата.

Любая идея о том, что происходит?

-

РЕДАКТИРОВАТЬ:

Тип на БД numeric, в программе представлена ​​в виде doubledecimal.

PSQL печатает это:

-
0,00
(1 строка)

-

EDIT 2:

log_statement = 'all' дает Страннее результат:

UPDATE "TABLE" SET ... "WEIRD_FIELD"=$8 ... WHERE ... 

DETAIL: parameters: $1 = '7', $2 = '7', $3 = '18', $4 = '18', $5 = 'V03', $6 = 'Hz', 
        $7 = 'Hz', $8 = '0.00', $9 = '0', $10 = '2', $11 = '0' 

Параметр для странного поля печатается как ноль (0.00), но очевидно, что это не ...

Обратите внимание, что значение в DataGridView населенной DataAdapter появляется правильный0.001.

-

EDIT 3 (Maurice):

Проблема с адаптером Devart кажется фиксированным. Используя последнюю версию, я больше не вижу проблемы. Я думаю, что это связано с этим конкретным исправлением: 7.3.293 20-ноя-14: ошибка с точной потерей при работе с PgSqlType.Numeric по протоколу 3 исправлена ​​ Я обновил свое программное обеспечение с помощью новейших сборок Devart, и теперь все работает как и ожидалось.

+0

Некоторые детали типа данных столбца PostgreSQL, соответствующее поле в приложении и быстрая проверка значений psql могут быть полезны ... –

+0

@RichardHuxton см. В редакторе – Teejay

+0

Тип на db не является "числовым" - это не формат вывода для поля «числовой». Возможно ли это «числовые (3,2)» или некоторые такие? –

ответ

2

Мы обнаружили, что проблема в том, что проблема в том, что PgSql представляет numeric s (десятичный) с неопределенной точностью и шкалой.

Значение в БД кажется правильным (0.001), но в некоторых операций, которые он усекается:

"weird_field" + 0.001 
--------------------- 
       0.002 

но

"weird_field" * 2 
-------------------- 
       0.00 

и

"weird_field" * 5 
-------------------- 
       0.01 

Это также объясняет почему некоторые запросы дают ошибку division by zero.

Решение состоит в том, чтобы указать точность и масштаб, например, мы выбрали numeric(38,28) (что мы также используем для decimal в Oracle), и все работает нормально.

-

Глядя на PGSQL документации, мы не нашли ничего такого поведения, поэтому мы считаем, что это ошибка:

Указание:
NUMERIC
без точности и масштаба создает столбец, в котором могут храниться числовые значения любой точности и масштаба, вплоть до предела реализации по точности. Столбец такого типа не будет принуждать входные значения к любому конкретному масштабу, тогда как числовые столбцы с объявленным масштабом будут принуждать входные значения к этому масштабу.

Странная вещь также, что 0.000001 (и др Similia) не оборваны, в то время как 0.001 делает.

+1

Можете ли вы создать тестовый пример, демонстрирующий это, предпочтительно используя только SQL? Что такое PostgreSQL-версия? –

+1

Это невозможно с использованием простого sql. Это проблема, связанная с DataAdapter. Кажется, это ошибка Devart, но Postgres, с ее угла, хранит странное значение. Я открыл отчет об ошибке на http://www.postgresql.org/message-id/[email protected] – Teejay

+0

Чтобы суммировать поток ошибок: адаптер DevArt отправляет неверные двоичные параметры для числовых значений, а PostgreSQL недостаточно параноидально относится к вводу, поэтому он принимает их вместо того, чтобы бросать ошибку. –