712 SQLRETURN r = SQL_SUCCESS;
713 for (
const auto connOpt : QStringTokenizer{connOpts, u';', Qt::SkipEmptyParts}) {
715 if ((idx = connOpt.indexOf(u'=')) == -1) {
716 qSqlWarning((
"QODBCDriver::open: Illegal connect option value '%1'"_L1)
717 .arg(connOpt),
this);
720 const auto opt(connOpt.left(idx));
721 const auto val(connOpt.mid(idx + 1).trimmed());
725 if (opt ==
"SQL_ATTR_ACCESS_MODE"_L1) {
726 if (val ==
"SQL_MODE_READ_ONLY"_L1) {
727 v = SQL_MODE_READ_ONLY;
728 }
else if (val ==
"SQL_MODE_READ_WRITE"_L1) {
729 v = SQL_MODE_READ_WRITE;
731 qSqlWarning((
"QODBCDriver::open: Unknown option value '%1'"_L1)
735 r = SQLSetConnectAttr(hDbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER) size_t(v), 0);
736 }
else if (opt ==
"SQL_ATTR_CONNECTION_TIMEOUT"_L1) {
738 r = SQLSetConnectAttr(hDbc, SQL_ATTR_CONNECTION_TIMEOUT, (SQLPOINTER) size_t(v), 0);
739 }
else if (opt ==
"SQL_ATTR_LOGIN_TIMEOUT"_L1) {
741 r = SQLSetConnectAttr(hDbc, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER) size_t(v), 0);
742 }
else if (opt ==
"SQL_ATTR_CURRENT_CATALOG"_L1) {
743 r = qt_string_SQLSetConnectAttr(hDbc, SQL_ATTR_CURRENT_CATALOG, val);
744 }
else if (opt ==
"SQL_ATTR_METADATA_ID"_L1) {
745 if (val ==
"SQL_TRUE"_L1) {
747 }
else if (val ==
"SQL_FALSE"_L1) {
750 qSqlWarning((
"QODBCDriver::open: Unknown option value '%1'"_L1)
754 r = SQLSetConnectAttr(hDbc, SQL_ATTR_METADATA_ID, (SQLPOINTER) size_t(v), 0);
755 }
else if (opt ==
"SQL_ATTR_PACKET_SIZE"_L1) {
757 r = SQLSetConnectAttr(hDbc, SQL_ATTR_PACKET_SIZE, (SQLPOINTER) size_t(v), 0);
758 }
else if (opt ==
"SQL_ATTR_TRACEFILE"_L1) {
759 r = qt_string_SQLSetConnectAttr(hDbc, SQL_ATTR_TRACEFILE, val);
760 }
else if (opt ==
"SQL_ATTR_TRACE"_L1) {
761 if (val ==
"SQL_OPT_TRACE_OFF"_L1) {
762 v = SQL_OPT_TRACE_OFF;
763 }
else if (val ==
"SQL_OPT_TRACE_ON"_L1) {
764 v = SQL_OPT_TRACE_ON;
766 qSqlWarning((
"QODBCDriver::open: Unknown option value '%1'"_L1)
770 r = SQLSetConnectAttr(hDbc, SQL_ATTR_TRACE, (SQLPOINTER) size_t(v), 0);
771 }
else if (opt ==
"SQL_ATTR_CONNECTION_POOLING"_L1) {
772 if (val ==
"SQL_CP_OFF"_L1)
774 else if (val ==
"SQL_CP_ONE_PER_DRIVER"_L1)
775 v = SQL_CP_ONE_PER_DRIVER;
776 else if (val ==
"SQL_CP_ONE_PER_HENV"_L1)
777 v = SQL_CP_ONE_PER_HENV;
778 else if (val ==
"SQL_CP_DEFAULT"_L1)
781 qSqlWarning((
"QODBCDriver::open: Unknown option value '%1'"_L1)
785 r = SQLSetConnectAttr(hDbc, SQL_ATTR_CONNECTION_POOLING, (SQLPOINTER) size_t(v), 0);
786 }
else if (opt ==
"SQL_ATTR_CP_MATCH"_L1) {
787 if (val ==
"SQL_CP_STRICT_MATCH"_L1)
788 v = SQL_CP_STRICT_MATCH;
789 else if (val ==
"SQL_CP_RELAXED_MATCH"_L1)
790 v = SQL_CP_RELAXED_MATCH;
791 else if (val ==
"SQL_CP_MATCH_DEFAULT"_L1)
792 v = SQL_CP_MATCH_DEFAULT;
794 qSqlWarning((
"QODBCDriver::open: Unknown option value '%1'"_L1)
798 r = SQLSetConnectAttr(hDbc, SQL_ATTR_CP_MATCH, (SQLPOINTER) size_t(v), 0);
799 }
else if (opt ==
"SQL_ATTR_ODBC_VERSION"_L1) {
803 qSqlWarning((
"QODBCDriver::open: Unknown connection attribute '%1'"_L1)
806 if (!SQL_SUCCEEDED(r))
807 qSqlWarning((
"QODBCDriver::open: Unable to set connection attribute '%1'"_L1)
916 setAt(QSql::BeforeFirstRow);
918 d->fieldCache.clear();
919 d->fieldCacheIdx = 0;
924 if (d->hStmt && d->isStmtHandleValid()) {
925 r = SQLFreeHandle(SQL_HANDLE_STMT, d->hStmt);
926 if (r != SQL_SUCCESS) {
927 qSqlWarning(
"QODBCResult::reset: Unable to free statement handle"_L1, d);
931 r = SQLAllocHandle(SQL_HANDLE_STMT,
934 if (r != SQL_SUCCESS) {
935 qSqlWarning(
"QODBCResult::reset: Unable to allocate statement handle"_L1, d);
939 d->updateStmtHandleState();
942 uint64_t sqlStmtVal = isForwardOnly() ? SQL_NONSCROLLABLE : SQL_SCROLLABLE;
943 r = SQLSetStmtAttr(d->hStmt, SQL_ATTR_CURSOR_SCROLLABLE, SQLPOINTER(sqlStmtVal), SQL_IS_UINTEGER);
944 if (!SQL_SUCCEEDED(r)) {
946 sqlStmtVal = isForwardOnly() ? SQL_CURSOR_FORWARD_ONLY : SQL_CURSOR_STATIC;
947 r = SQLSetStmtAttr(d->hStmt, SQL_ATTR_CURSOR_TYPE, SQLPOINTER(sqlStmtVal), SQL_IS_UINTEGER);
948 if (!SQL_SUCCEEDED(r)) {
949 setLastError(qMakeError(
950 QCoreApplication::translate(
"QODBCResult",
951 "QODBCResult::reset: Unable to set 'SQL_ATTR_CURSOR_TYPE' "
952 "as statement attribute. "
953 "Please check your ODBC driver configuration"),
954 QSqlError::StatementError, d));
960 auto encoded = toSQLTCHAR(query);
961 r = SQLExecDirect(d->hStmt,
963 SQLINTEGER(encoded.size()));
965 if (!SQL_SUCCEEDED(r) && r!= SQL_NO_DATA) {
966 setLastError(qMakeError(QCoreApplication::translate(
"QODBCResult",
967 "Unable to execute statement"), QSqlError::StatementError, d));
971 SQLULEN isScrollable = 0;
972 r = SQLGetStmtAttr(d->hStmt, SQL_ATTR_CURSOR_SCROLLABLE, &isScrollable, SQL_IS_INTEGER, 0);
973 if (SQL_SUCCEEDED(r))
974 setForwardOnly(isScrollable == SQL_NONSCROLLABLE);
976 SQLSMALLINT count = 0;
977 SQLNumResultCols(d->hStmt, &count);
980 for (SQLSMALLINT i = 0; i < count; ++i)
981 d->rInf.append(qMakeFieldInfo(d, i));
982 d->fieldCache.resize(count);
1137 if (field >= d->rInf.count() || field < 0) {
1138 qSqlWarning((
"QODBCResult::data: column %1 out of range"_L1)
1139 .arg(QString::number(field)), d);
1142 if (field < d->fieldCacheIdx)
1143 return d->fieldCache.at(field);
1146 SQLLEN lengthIndicator = 0;
1148 for (
int i = d->fieldCacheIdx; i <= field; ++i) {
1151 const QSqlField info = d->rInf.field(i);
1152 const auto metaTypeId = info.metaType().id();
1153 switch (metaTypeId) {
1154 case QMetaType::LongLong:
1155 d->fieldCache[i] = qGetIntData<int64_t>(d->hStmt, i);
1157 case QMetaType::Int:
1158 d->fieldCache[i] = qGetIntData<int32_t>(d->hStmt, i);
1160 case QMetaType::Short:
1161 d->fieldCache[i] = qGetIntData<int16_t>(d->hStmt, i);
1163 case QMetaType::ULongLong:
1164 d->fieldCache[i] = qGetIntData<uint64_t>(d->hStmt, i);
1166 case QMetaType::UInt:
1167 d->fieldCache[i] = qGetIntData<uint32_t>(d->hStmt, i);
1169 case QMetaType::UShort:
1170 d->fieldCache[i] = qGetIntData<uint16_t>(d->hStmt, i);
1172 case QMetaType::QDate:
1174 r = SQLGetData(d->hStmt,
1180 if (SQL_SUCCEEDED(r) && (lengthIndicator != SQL_NULL_DATA))
1181 d->fieldCache[i] = QVariant(QDate(dbuf.year, dbuf.month, dbuf.day));
1183 d->fieldCache[i] = QVariant(QMetaType::fromType<QDate>());
1185 case QMetaType::QTime:
1187 r = SQLGetData(d->hStmt,
1193 if (SQL_SUCCEEDED(r) && (lengthIndicator != SQL_NULL_DATA))
1194 d->fieldCache[i] = QVariant(QTime(tbuf.hour, tbuf.minute, tbuf.second));
1196 d->fieldCache[i] = QVariant(QMetaType::fromType<QTime>());
1198 case QMetaType::QDateTime:
1199 TIMESTAMP_STRUCT dtbuf;
1200 r = SQLGetData(d->hStmt,
1206 if (SQL_SUCCEEDED(r) && (lengthIndicator != SQL_NULL_DATA))
1207 d->fieldCache[i] = QVariant(QDateTime(QDate(dtbuf.year, dtbuf.month, dtbuf.day),
1208 QTime(dtbuf.hour, dtbuf.minute, dtbuf.second, dtbuf.fraction / 1000000)));
1210 d->fieldCache[i] = QVariant(QMetaType::fromType<QDateTime>());
1212 case QMetaType::QByteArray:
1213 d->fieldCache[i] = qGetBinaryData(d->hStmt, i);
1215 case QMetaType::QString:
1216 d->fieldCache[i] = qGetStringData(d->hStmt, i, info.length(), d->unicode);
1218 case QMetaType::Float:
1219 case QMetaType::Double:
1220 switch (numericalPrecisionPolicy()) {
1221 case QSql::LowPrecisionInt32:
1222 d->fieldCache[i] = qGetIntData<int32_t>(d->hStmt, i);
1224 case QSql::LowPrecisionInt64:
1225 d->fieldCache[i] = qGetIntData<int64_t>(d->hStmt, i);
1227 case QSql::LowPrecisionDouble:
1228 if (metaTypeId == QMetaType::Float)
1229 d->fieldCache[i] = qGetFloatingPointData<
float>(d->hStmt, i);
1231 d->fieldCache[i] = qGetFloatingPointData<
double>(d->hStmt, i);
1233 case QSql::HighPrecision:
1234 d->fieldCache[i] = qGetStringData(d->hStmt, i, -1,
false);
1239 d->fieldCache[i] = qGetStringData(d->hStmt, i, info.length(),
false);
1242 d->fieldCacheIdx = field + 1;
1244 return d->fieldCache[field];
1342 setAt(QSql::BeforeFirstRow);
1344 d->fieldCache.clear();
1345 d->fieldCacheIdx = 0;
1348 qSqlWarning(
"QODBCResult::exec: No statement handle available"_L1, d);
1353 SQLCloseCursor(d->hStmt);
1355 QVariantList &values = boundValues();
1356 QByteArrayList tmpStorage(values.count(), QByteArray());
1357 QVarLengthArray<SQLLEN, 32> indicators(values.count(), 0);
1361 for (qsizetype i = 0; i < values.count(); ++i) {
1362 if (bindValueType(i) & QSql::Out)
1364 const QVariant &val = values.at(i);
1365 SQLLEN *ind = &indicators[i];
1366 if (QSqlResultPrivate::isVariantNull(val))
1367 *ind = SQL_NULL_DATA;
1368 switch (val.typeId()) {
1369 case QMetaType::QDate: {
1370 QByteArray &ba = tmpStorage[i];
1371 ba.resize(
sizeof(DATE_STRUCT));
1372 DATE_STRUCT *dt = (DATE_STRUCT *)
const_cast<
char *>(ba.constData());
1373 QDate qdt = val.toDate();
1374 dt->year = qdt.year();
1375 dt->month = qdt.month();
1376 dt->day = qdt.day();
1377 r = SQLBindParameter(d->hStmt,
1379 qParamType[bindValueType(i) & QSql::InOut],
1386 *ind == SQL_NULL_DATA ? ind : NULL);
1388 case QMetaType::QTime: {
1389 QByteArray &ba = tmpStorage[i];
1390 ba.resize(
sizeof(TIME_STRUCT));
1391 TIME_STRUCT *dt = (TIME_STRUCT *)
const_cast<
char *>(ba.constData());
1392 QTime qdt = val.toTime();
1393 dt->hour = qdt.hour();
1394 dt->minute = qdt.minute();
1395 dt->second = qdt.second();
1396 r = SQLBindParameter(d->hStmt,
1398 qParamType[bindValueType(i) & QSql::InOut],
1405 *ind == SQL_NULL_DATA ? ind : NULL);
1407 case QMetaType::QDateTime: {
1408 QByteArray &ba = tmpStorage[i];
1409 ba.resize(
sizeof(TIMESTAMP_STRUCT));
1410 TIMESTAMP_STRUCT *dt =
reinterpret_cast<TIMESTAMP_STRUCT *>(
const_cast<
char *>(ba.constData()));
1411 const QDateTime qdt = val.toDateTime();
1412 const QDate qdate = qdt.date();
1413 const QTime qtime = qdt.time();
1414 dt->year = qdate.year();
1415 dt->month = qdate.month();
1416 dt->day = qdate.day();
1417 dt->hour = qtime.hour();
1418 dt->minute = qtime.minute();
1419 dt->second = qtime.second();
1421 const int precision = d->drv_d_func()->datetimePrecision - 20;
1422 if (precision <= 0) {
1425 dt->fraction = qtime.msec() * 1000000;
1428 int keep = (
int)qPow(10.0, 9 - qMin(9, precision));
1429 dt->fraction = (dt->fraction / keep) * keep;
1432 r = SQLBindParameter(d->hStmt,
1434 qParamType[bindValueType(i) & QSql::InOut],
1437 d->drv_d_func()->datetimePrecision,
1441 *ind == SQL_NULL_DATA ? ind : NULL);
1443 case QMetaType::Int:
1444 r = SQLBindParameter(d->hStmt,
1446 qParamType[bindValueType(i) & QSql::InOut],
1451 const_cast<
void *>(val.constData()),
1453 *ind == SQL_NULL_DATA ? ind : NULL);
1455 case QMetaType::UInt:
1456 r = SQLBindParameter(d->hStmt,
1458 qParamType[bindValueType(i) & QSql::InOut],
1463 const_cast<
void *>(val.constData()),
1465 *ind == SQL_NULL_DATA ? ind : NULL);
1467 case QMetaType::Short:
1468 r = SQLBindParameter(d->hStmt,
1470 qParamType[bindValueType(i) & QSql::InOut],
1475 const_cast<
void *>(val.constData()),
1477 *ind == SQL_NULL_DATA ? ind : NULL);
1479 case QMetaType::UShort:
1480 r = SQLBindParameter(d->hStmt,
1482 qParamType[bindValueType(i) & QSql::InOut],
1487 const_cast<
void *>(val.constData()),
1489 *ind == SQL_NULL_DATA ? ind : NULL);
1491 case QMetaType::Double:
1492 r = SQLBindParameter(d->hStmt,
1494 qParamType[bindValueType(i) & QSql::InOut],
1499 const_cast<
void *>(val.constData()),
1501 *ind == SQL_NULL_DATA ? ind : NULL);
1503 case QMetaType::Float:
1504 r = SQLBindParameter(d->hStmt,
1506 qParamType[bindValueType(i) & QSql::InOut],
1511 const_cast<
void *>(val.constData()),
1513 *ind == SQL_NULL_DATA ? ind : NULL);
1515 case QMetaType::LongLong:
1516 r = SQLBindParameter(d->hStmt,
1518 qParamType[bindValueType(i) & QSql::InOut],
1523 const_cast<
void *>(val.constData()),
1525 *ind == SQL_NULL_DATA ? ind : NULL);
1527 case QMetaType::ULongLong:
1528 r = SQLBindParameter(d->hStmt,
1530 qParamType[bindValueType(i) & QSql::InOut],
1535 const_cast<
void *>(val.constData()),
1537 *ind == SQL_NULL_DATA ? ind : NULL);
1539 case QMetaType::QByteArray:
1540 if (*ind != SQL_NULL_DATA) {
1541 *ind = val.toByteArray().size();
1543 r = SQLBindParameter(d->hStmt,
1545 qParamType[bindValueType(i) & QSql::InOut],
1548 val.toByteArray().size(),
1550 const_cast<
char *>(val.toByteArray().constData()),
1551 val.toByteArray().size(),
1554 case QMetaType::Bool:
1555 r = SQLBindParameter(d->hStmt,
1557 qParamType[bindValueType(i) & QSql::InOut],
1562 const_cast<
void *>(val.constData()),
1564 *ind == SQL_NULL_DATA ? ind : NULL);
1566 case QMetaType::QString:
1568 QByteArray &ba = tmpStorage[i];
1570 const auto encoded = toSQLTCHAR(val.toString());
1571 ba = QByteArray(
reinterpret_cast<
const char *>(encoded.data()),
1572 encoded.size() *
sizeof(SQLTCHAR));
1575 if (*ind != SQL_NULL_DATA)
1578 if (bindValueType(i) & QSql::Out) {
1579 r = SQLBindParameter(d->hStmt,
1581 qParamType[bindValueType(i) & QSql::InOut],
1583 ba.size() > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR,
1586 const_cast<
char *>(ba.constData()),
1591 r = SQLBindParameter(d->hStmt,
1593 qParamType[bindValueType(i) & QSql::InOut],
1595 ba.size() > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR,
1598 const_cast<
char *>(ba.constData()),
1605 QByteArray &str = tmpStorage[i];
1606 str = val.toString().toUtf8();
1607 if (*ind != SQL_NULL_DATA)
1608 *ind = str.length();
1609 int strSize = str.length();
1611 r = SQLBindParameter(d->hStmt,
1613 qParamType[bindValueType(i) & QSql::InOut],
1615 strSize > 254 ? SQL_LONGVARCHAR : SQL_VARCHAR,
1618 const_cast<
char *>(str.constData()),
1625 QByteArray &ba = tmpStorage[i];
1626 if (*ind != SQL_NULL_DATA)
1628 r = SQLBindParameter(d->hStmt,
1630 qParamType[bindValueType(i) & QSql::InOut],
1635 const_cast<
char *>(ba.constData()),
1640 if (r != SQL_SUCCESS) {
1641 qSqlWarning(
"QODBCResult::exec: unable to bind variable:"_L1, d);
1642 setLastError(qMakeError(QCoreApplication::translate(
"QODBCResult",
1643 "Unable to bind variable"), QSqlError::StatementError, d));
1647 r = SQLExecute(d->hStmt);
1648 if (!SQL_SUCCEEDED(r) && r != SQL_NO_DATA) {
1649 qSqlWarning(
"QODBCResult::exec: Unable to execute statement:"_L1, d);
1650 setLastError(qMakeError(QCoreApplication::translate(
"QODBCResult",
1651 "Unable to execute statement"), QSqlError::StatementError, d));
1655 SQLULEN isScrollable = 0;
1656 r = SQLGetStmtAttr(d->hStmt, SQL_ATTR_CURSOR_SCROLLABLE, &isScrollable, SQL_IS_INTEGER, 0);
1657 if (SQL_SUCCEEDED(r))
1658 setForwardOnly(isScrollable == SQL_NONSCROLLABLE);
1660 SQLSMALLINT count = 0;
1661 SQLNumResultCols(d->hStmt, &count);
1664 for (SQLSMALLINT i = 0; i < count; ++i)
1665 d->rInf.append(qMakeFieldInfo(d, i));
1666 d->fieldCache.resize(count);
1674 if (!hasOutValues())
1677 for (qsizetype i = 0; i < values.count(); ++i) {
1678 switch (values.at(i).typeId()) {
1679 case QMetaType::QDate: {
1680 DATE_STRUCT ds = *((DATE_STRUCT *)
const_cast<
char *>(tmpStorage.at(i).constData()));
1681 values[i] = QVariant(QDate(ds.year, ds.month, ds.day));
1683 case QMetaType::QTime: {
1684 TIME_STRUCT dt = *((TIME_STRUCT *)
const_cast<
char *>(tmpStorage.at(i).constData()));
1685 values[i] = QVariant(QTime(dt.hour, dt.minute, dt.second));
1687 case QMetaType::QDateTime: {
1688 TIMESTAMP_STRUCT dt = *((TIMESTAMP_STRUCT*)
1689 const_cast<
char *>(tmpStorage.at(i).constData()));
1690 values[i] = QVariant(QDateTime(QDate(dt.year, dt.month, dt.day),
1691 QTime(dt.hour, dt.minute, dt.second, dt.fraction / 1000000)));
1693 case QMetaType::Bool:
1694 case QMetaType::Short:
1695 case QMetaType::UShort:
1696 case QMetaType::Int:
1697 case QMetaType::UInt:
1698 case QMetaType::Float:
1699 case QMetaType::Double:
1700 case QMetaType::QByteArray:
1701 case QMetaType::LongLong:
1702 case QMetaType::ULongLong:
1705 case QMetaType::QString:
1707 if (bindValueType(i) & QSql::Out) {
1708 const QByteArray &bytes = tmpStorage.at(i);
1709 const auto strSize = bytes.size() /
sizeof(SQLTCHAR);
1710 QVarLengthArray<SQLTCHAR> string(strSize);
1711 memcpy(string.data(), bytes.data(), strSize *
sizeof(SQLTCHAR));
1712 values[i] = fromSQLTCHAR(string);
1718 if (bindValueType(i) & QSql::Out)
1719 values[i] = tmpStorage.at(i);
1722 if (indicators[i] == SQL_NULL_DATA)
1723 values[i] = QVariant(values[i].metaType());
1900bool QODBCDriver::open(
const QString & db,
1901 const QString & user,
1902 const QString & password,
1905 const QString& connOpts)
1911 r = SQLAllocHandle(SQL_HANDLE_ENV,
1914 if (!SQL_SUCCEEDED(r)) {
1915 qSqlWarning(
"QODBCDriver::open: Unable to allocate environment"_L1, d);
1919 r = SQLSetEnvAttr(d->hEnv,
1920 SQL_ATTR_ODBC_VERSION,
1921 (SQLPOINTER)qGetODBCVersion(connOpts),
1923 r = SQLAllocHandle(SQL_HANDLE_DBC,
1926 if (!SQL_SUCCEEDED(r)) {
1927 qSqlWarning(
"QODBCDriver::open: Unable to allocate connection"_L1, d);
1933 if (!d->setConnectionOptions(connOpts)) {
1941 if (db.contains(
".dsn"_L1, Qt::CaseInsensitive))
1942 connQStr =
"FILEDSN="_L1 + db;
1943 else if (db.contains(
"DRIVER="_L1, Qt::CaseInsensitive)
1944 || db.contains(
"SERVER="_L1, Qt::CaseInsensitive))
1947 connQStr =
"DSN="_L1 + db;
1949 const auto escapeUserPassword = [](QString arg) -> QString {
1950 return u'{' + arg.replace(u'}',
"}}"_L1) + u'}';
1952 if (!user.isEmpty())
1953 connQStr +=
";UID="_L1 + escapeUserPassword(user);
1954 if (!password.isEmpty())
1955 connQStr +=
";PWD="_L1 + escapeUserPassword(password);
1958 QVarLengthArray<SQLTCHAR, 1024> connOut(1024);
1960 auto encoded = toSQLTCHAR(connQStr);
1961 r = SQLDriverConnect(d->hDbc,
1963 encoded.data(), SQLSMALLINT(encoded.size()),
1964 connOut.data(), SQLSMALLINT(connOut.size()),
1969 if (!SQL_SUCCEEDED(r)) {
1970 setLastError(qMakeError(tr(
"Unable to connect"), QSqlError::ConnectionError, d));
1976 if (!d->checkDriver()) {
1977 setLastError(qMakeError(tr(
"Unable to connect - Driver doesn't support all "
1978 "functionality required"), QSqlError::ConnectionError, d));
1985 d->checkSchemaUsage();
1987 d->checkHasSQLFetchScroll();
1988 d->checkHasMultiResults();
1989 d->checkDateTimePrecision();
1990 d->checkDefaultCase();
1992 setOpenError(
false);
1993 if (d->dbmsType == MSSqlServer) {
1994 QSqlQuery i(createResult());
1995 i.exec(
"SET QUOTED_IDENTIFIER ON"_L1);