В процессе разработки приложения под Qt , которое должно будет работать с базами данных необходимо учитывать тот нюанс, что драйвер Qt для целевой Базы Данных может не поддерживать все типы данных, которые Вы могли заложить в Вашу Базу Данных. Например, один из подобных примеров, с которым столкнулся один из Читателей сайта, это проблема с отображением типа данных DECIMAL через QSqlTableModel . В то время, как при разработке приложения на C++ Builder этот тип данных отлично отображался в представлении.
А работа производилась с базой данных MS SQL , для которой использовался драйвер ODBC . Результаты работы приложений на C++ Builder и на Qt приведены на нижеследующих рисунках. Разница во внешнем виде таблиц состоит в том, что в приложении на Qt отсутствуют значения в представлении, где тип данных в базе данных был объявлен как DECIMAL .
Приложение на C++ Builder - Все колонки заполнены
Приложение на Qt - отсутствуют значения в колонках с типом данных DECIMAL
Проверяем типы данных в документации
При проверке поддерживаемых типов данных на странице в официальной документации находим типы данных, которые поддерживаются, выбранным драйвером и корректируем Базу Данных в соответствии с типами данных, которые поддерживаются этим самым драйвером.
ODBC Data Types
ODBC data type | SQL type description | Recommended input (C++ or Qt data type) |
---|---|---|
BIT | Boolean | BOOL |
TINYINT | 8 bit integer | typedef qint8 |
SMALLINT | 16-bit signed integer | typedef qint16 |
INTEGER | 32-bit signed integer | typedef qint32 |
BIGINT | 64-bit signed integer | typedef qint64 |
REAL | 32-bit Single-precision floating point | By default mapping to QString |
FLOAT | 64-bit Double floating point | By default mapping to QString |
DOUBLE | 64-bit Double floating point | By default mapping to QString |
CHAR | Character string | Mapped to QString |
VARCHAR | Character string | Mapped to QString |
LONGVARCHAR | Character string | Mapped to QString |
CLOB | Character large string object | Mapped to QString |
DATE | Character string | Mapped to QDate |
TIME | Character Time, Character string | Mapped to QTime |
TIMESTAMP | Character Time, Character string | Mapped to QDateTime |
Итог
В результате тип DECIMAL был просто сменён на тип INTEGER и всё взлетело.