From b211148e4b4167483e1a78a45ae8fef97e5a4f2d Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Fri, 1 Jan 2021 20:07:29 +0100 Subject: Sql ODBC driver: add direct support for float and short datatype This patch adds native support for SQL_REAL (float) and SQL_SMALLINT (short). Previously those datatypes were mapped to double and integer. [ChangeLog][QtSql] The ODBC driver now properly maps QMetaType::Float to real sql datatype and QMetaType::Short to smallint Fixes: QTBUG-8963 Fixes: QTBUG-57279 Change-Id: Ifec4c609734dbe6165c1ebdadb461c2aae47ba78 Reviewed-by: Andy Shaw --- src/plugins/sqldrivers/odbc/qsql_odbc.cpp | 53 ++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) (limited to 'src/plugins/sqldrivers/odbc/qsql_odbc.cpp') diff --git a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp index dd6eaab9cf..026a970cf0 100644 --- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp +++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp @@ -347,12 +347,16 @@ static QMetaType qDecodeODBCType(SQLSMALLINT sqltype, bool isSigned = true) switch (sqltype) { case SQL_DECIMAL: case SQL_NUMERIC: - case SQL_REAL: - case SQL_FLOAT: - case SQL_DOUBLE: + case SQL_FLOAT: // 24 or 53 bits precision + case SQL_DOUBLE:// 53 bits type = QMetaType::Double; break; + case SQL_REAL: // 24 bits + type = QMetaType::Float; + break; case SQL_SMALLINT: + type = isSigned ? QMetaType::Short : QMetaType::UShort; + break; case SQL_INTEGER: case SQL_BIT: type = isSigned ? QMetaType::Int : QMetaType::UInt; @@ -1220,9 +1224,11 @@ QVariant QODBCResult::data(int field) d->fieldCache[i] = qGetBigIntData(d->hStmt, i, false); break; case QMetaType::Int: + case QMetaType::Short: d->fieldCache[i] = qGetIntData(d->hStmt, i); - break; + break; case QMetaType::UInt: + case QMetaType::UShort: d->fieldCache[i] = qGetIntData(d->hStmt, i, false); break; case QMetaType::QDate: @@ -1513,6 +1519,30 @@ bool QODBCResult::exec() 0, *ind == SQL_NULL_DATA ? ind : NULL); break; + case QMetaType::Short: + r = SQLBindParameter(d->hStmt, + i + 1, + qParamType[bindValueType(i) & QSql::InOut], + SQL_C_SSHORT, + SQL_SMALLINT, + 0, + 0, + const_cast(val.constData()), + 0, + *ind == SQL_NULL_DATA ? ind : NULL); + break; + case QMetaType::UShort: + r = SQLBindParameter(d->hStmt, + i + 1, + qParamType[bindValueType(i) & QSql::InOut], + SQL_C_USHORT, + SQL_NUMERIC, + 15, + 0, + const_cast(val.constData()), + 0, + *ind == SQL_NULL_DATA ? ind : NULL); + break; case QMetaType::Double: r = SQLBindParameter(d->hStmt, i + 1, @@ -1525,6 +1555,18 @@ bool QODBCResult::exec() 0, *ind == SQL_NULL_DATA ? ind : NULL); break; + case QMetaType::Float: + r = SQLBindParameter(d->hStmt, + i + 1, + qParamType[bindValueType(i) & QSql::InOut], + SQL_C_FLOAT, + SQL_REAL, + 0, + 0, + const_cast(val.constData()), + 0, + *ind == SQL_NULL_DATA ? ind : NULL); + break; case QMetaType::LongLong: r = SQLBindParameter(d->hStmt, i + 1, @@ -1705,8 +1747,11 @@ bool QODBCResult::exec() QTime(dt.hour, dt.minute, dt.second, dt.fraction / 1000000))); break; } case QMetaType::Bool: + case QMetaType::Short: + case QMetaType::UShort: case QMetaType::Int: case QMetaType::UInt: + case QMetaType::Float: case QMetaType::Double: case QMetaType::QByteArray: case QMetaType::LongLong: -- cgit v1.2.3