QTBUG-1363: fix QSqlField.length() for ODBC
authorMark Brand <mabrand@mabrand.nl>
Thu, 12 Apr 2012 10:49:03 +0000 (12:49 +0200)
committerQt by Nokia <qt-info@nokia.com>
Fri, 13 Apr 2012 19:26:07 +0000 (21:26 +0200)
Applied Bill King's suggestion in QTBUG-1363. Columns of
hStmt must be accessed in order.

Verified using ODBC driver on SQL Server 2005 on Windows 7.

Added test for length of text field for MS SQL Server over ODBC.

Task-Id: QTBUG-1363
Change-Id: I6673dafe75e3ef394d41e439adb45096c1421068
Reviewed-by: Bill King <bill.king@nokia.com>
Reviewed-by: Mark Brand <mabrand@mabrand.nl>
src/sql/drivers/odbc/qsql_odbc.cpp
tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp

index 40cd2e6..d8015c7 100644 (file)
@@ -573,6 +573,11 @@ static QSqlField qMakeFieldInfo(const SQLHANDLE hStmt, const QODBCDriverPrivate*
     QString fname = qGetStringData(hStmt, 3, -1, p->unicode);
     int type = qGetIntData(hStmt, 4).toInt(); // column type
     QSqlField f(fname, qDecodeODBCType(type, p));
+    QVariant var = qGetIntData(hStmt, 6);
+    f.setLength(var.isNull() ? -1 : var.toInt()); // column size
+    var = qGetIntData(hStmt, 8).toInt();
+    f.setPrecision(var.isNull() ? -1 : var.toInt()); // precision
+    f.setSqlType(type);
     int required = qGetIntData(hStmt, 10).toInt(); // nullable-flag
     // required can be SQL_NO_NULLS, SQL_NULLABLE or SQL_NULLABLE_UNKNOWN
     if (required == SQL_NO_NULLS)
@@ -580,11 +585,6 @@ static QSqlField qMakeFieldInfo(const SQLHANDLE hStmt, const QODBCDriverPrivate*
     else if (required == SQL_NULLABLE)
         f.setRequired(false);
     // else we don't know
-    QVariant var = qGetIntData(hStmt, 6);
-    f.setLength(var.isNull() ? -1 : var.toInt()); // column size
-    var = qGetIntData(hStmt, 8).toInt();
-    f.setPrecision(var.isNull() ? -1 : var.toInt()); // precision
-    f.setSqlType(type);
     return f;
 }
 
index 68a347e..7d34981 100644 (file)
@@ -129,6 +129,10 @@ void tst_QSqlDriver::record()
     QSqlRecord rec = db.driver()->record(tablename);
     QCOMPARE(rec.count(), 4);
 
+    // QTBUG-1363: QSqlField::length() always return -1 when using QODBC3 driver and QSqlDatabase::record()
+    if (db.driverName().startsWith("QODBC") && tst_Databases::isSqlServer(db))
+        QCOMPARE(rec.field(1).length(), 20);
+
     if (db.driverName().startsWith("QIBASE")|| db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2"))
         for(int i = 0; i < fields.count(); ++i)
             fields[i] = fields[i].toUpper();