У меня с Qt SQL driver for Firebird with IBPP library косяк.
В базе есть поле NUMERIC(6, 3).
QFIREBIRD возвращает его, как QVariant(int), а вот QIBASE возвращает, как положено, QVariant(double).
Т.е., если в БД хранится число 3,14, то QFIREBIRD возвращает QVariant(int, 3140), QIBASE, как положено, вернёт QVariant(double, 3.14).
Firebird хранит NUMERIC и DECIMAL поля как целое число и его точность.
Драйвер так и возвращает поле.
QSqlField::type () вернет QVariant::qlonglong или QVariant::Int
QSqlField::precision () вернет значение точности, в Вашем случае 3
но
QSqlField::value () должен вернуть double 3,14
Свойство полей можно посмотреть в демо qt\demos\sqlbrowser\ правой кнопкой на таблице - Show Schema.
Драйвер обрабатывал только NUMERIC с большой длиной который хранился как longlong, то есть поля типа NUMERIC(12,2) обрабатывал корректно. Ваш вариант NUMERIC(6, 3) храниться в Firebird как int, а NUMERIC(3, 1) как short. Они и не обрабатывались правильно.
Короче...
Обновленная версия
Qt SQL driver for Firebird with IBPP library.http://code.google.com/p/qtfirebirdibppsqldriverИзменения в версии 0.16
- fixed: NUMERIC and DECIMAL fields with small length return wrong value (Issue 7)