📄 qsql_odbc.cpp
字号:
0, 0, (void *) dt, 0, *ind == SQL_NULL_DATA ? ind : NULL); tmpStorage.append(ba); break; } case QVariant::Time: { QByteArray ba; ba.resize(sizeof(TIME_STRUCT)); TIME_STRUCT *dt = (TIME_STRUCT *)ba.constData(); QTime qdt = val.toTime(); dt->hour = qdt.hour(); dt->minute = qdt.minute(); dt->second = qdt.second(); r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], SQL_C_TIME, SQL_TIME, 0, 0, (void *) dt, 0, *ind == SQL_NULL_DATA ? ind : NULL); tmpStorage.append(ba); break; } case QVariant::DateTime: { QByteArray ba; ba.resize(sizeof(TIMESTAMP_STRUCT)); TIMESTAMP_STRUCT * dt = (TIMESTAMP_STRUCT *)ba.constData(); QDateTime qdt = val.toDateTime(); dt->year = qdt.date().year(); dt->month = qdt.date().month(); dt->day = qdt.date().day(); dt->hour = qdt.time().hour(); dt->minute = qdt.time().minute(); dt->second = qdt.time().second(); dt->fraction = qdt.time().msec() * 1000000; r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], SQL_C_TIMESTAMP, SQL_TIMESTAMP, 19, 0, (void *) dt, 0, *ind == SQL_NULL_DATA ? ind : NULL); tmpStorage.append(ba); break; } case QVariant::Int: r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], SQL_C_SLONG, SQL_INTEGER, 0, 0, (void *) val.constData(), 0, *ind == SQL_NULL_DATA ? ind : NULL); break; case QVariant::UInt: r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], SQL_C_ULONG, SQL_NUMERIC, 0, 0, (void *) val.constData(), 0, *ind == SQL_NULL_DATA ? ind : NULL); break; case QVariant::Double: r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, (void *) val.constData(), 0, *ind == SQL_NULL_DATA ? ind : NULL); break; case QVariant::LongLong: r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], SQL_C_SBIGINT, SQL_BIGINT, 0, 0, (void *) val.constData(), 0, *ind == SQL_NULL_DATA ? ind : NULL); break; case QVariant::ULongLong: r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], SQL_C_UBIGINT, SQL_BIGINT, 0, 0, (void *) val.constData(), 0, *ind == SQL_NULL_DATA ? ind : NULL); break; case QVariant::ByteArray: if (*ind != SQL_NULL_DATA) { *ind = val.toByteArray().size(); } r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], SQL_C_BINARY, SQL_LONGVARBINARY, val.toByteArray().size(), 0, (void *) val.toByteArray().constData(), val.toByteArray().size(), ind); break;#ifndef Q_ODBC_VERSION_2 case QVariant::String: if (d->unicode) { QString str = val.toString(); str.utf16(); if (*ind != SQL_NULL_DATA) *ind = str.length() * sizeof(QChar); int strSize = str.length() * sizeof(QChar); if (bindValueType(i) & QSql::Out) { QByteArray ba((char*)str.constData(), str.capacity() * sizeof(QChar)); r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], SQL_C_WCHAR, strSize > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR, 0, // god knows... don't change this! 0, (void *)ba.constData(), ba.size(), ind); tmpStorage.append(ba); break; } r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], SQL_C_WCHAR, strSize > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR, strSize, 0, (void *)str.constData(), strSize, ind); break; }#endif // fall through default: { QByteArray ba = val.toByteArray(); if (*ind != SQL_NULL_DATA) *ind = ba.size(); r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], SQL_C_CHAR, SQL_LONGVARCHAR, ba.length() + 1, 0, (void *) ba.constData(), ba.length() + 1, ind); tmpStorage.append(ba); break; } } if (r != SQL_SUCCESS) { qWarning("QODBCResult::exec: unable to bind variable: %s", qODBCWarn(d).toLocal8Bit().constData()); setLastError(qMakeError(QCoreApplication::translate("QODBCResult", "Unable to bind variable"), QSqlError::StatementError, d)); return false; } } r = SQLExecute(d->hStmt); if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO) { qWarning("QODBCResult::exec: Unable to execute statement: %s", qODBCWarn(d).toLocal8Bit().constData()); setLastError(qMakeError(QCoreApplication::translate("QODBCResult", "Unable to execute statement"), QSqlError::StatementError, d)); return false; } SQLSMALLINT count; r = SQLNumResultCols(d->hStmt, &count); if (count) { setSelect(true); for (int i = 0; i < count; ++i) { d->rInf.append(qMakeFieldInfo(d, i)); } d->fieldCache.resize(count); } else { setSelect(false); } setActive(true); //get out parameters if (!hasOutValues()) return true; for (i = 0; i < values.count(); ++i) { switch (values.at(i).type()) { case QVariant::Date: { DATE_STRUCT ds = *((DATE_STRUCT *)tmpStorage.takeFirst().constData()); values[i] = QVariant(QDate(ds.year, ds.month, ds.day)); break; } case QVariant::Time: { TIME_STRUCT dt = *((TIME_STRUCT *)tmpStorage.takeFirst().constData()); values[i] = QVariant(QTime(dt.hour, dt.minute, dt.second)); break; } case QVariant::DateTime: { TIMESTAMP_STRUCT dt = *((TIMESTAMP_STRUCT*) tmpStorage.takeFirst().constData()); values[i] = QVariant(QDateTime(QDate(dt.year, dt.month, dt.day), QTime(dt.hour, dt.minute, dt.second, dt.fraction / 1000000))); break; } case QVariant::Int: case QVariant::UInt: case QVariant::Double: case QVariant::ByteArray: case QVariant::LongLong: case QVariant::ULongLong: //nothing to do break; case QVariant::String: if (d->unicode) { if (bindValueType(i) & QSql::Out) values[i] = QString::fromUtf16((ushort*)tmpStorage.takeFirst().constData()); break; } // fall through default: { QByteArray ba = tmpStorage.takeFirst(); if (bindValueType(i) & QSql::Out) values[i] = QString::fromAscii(ba.constData()); break; } } if (indicators[i] == SQL_NULL_DATA) values[i] = QVariant(values[i].type()); } return true;}QSqlRecord QODBCResult::record() const{ if (!isActive() || !isSelect()) return QSqlRecord(); return d->rInf;}QVariant QODBCResult::handle() const{ return QVariant(qRegisterMetaType<SQLHANDLE>("SQLHANDLE"), &d->hStmt);}////////////////////////////////////////QODBCDriver::QODBCDriver(QObject *parent) : QSqlDriver(parent){ init();}QODBCDriver::QODBCDriver(SQLHANDLE env, SQLHANDLE con, QObject * parent) : QSqlDriver(parent){ init(); d->hEnv = env; d->hDbc = con; if (env && con) { setOpen(true); setOpenError(false); }}void QODBCDriver::init(){ d = new QODBCDriverPrivate();}QODBCDriver::~QODBCDriver(){ cleanup(); delete d;}bool QODBCDriver::hasFeature(DriverFeature f) const{ switch (f) { case Transactions: { if (!d->hDbc) return false; SQLUSMALLINT txn; SQLSMALLINT t; int r = SQLGetInfo(d->hDbc, (SQLUSMALLINT)SQL_TXN_CAPABLE, &txn, sizeof(txn), &t); if (r != SQL_SUCCESS || txn == SQL_TC_NONE) return false; else return true; } case Unicode: return d->unicode; case PreparedQueries: case BLOB: case PositionalPlaceholders: return true; case QuerySize: case NamedPlaceholders: case LastInsertId: case BatchOperations: case SimpleLocking: case LowPrecisionNumbers: return false; } return false;}bool QODBCDriver::open(const QString & db, const QString & user, const QString & password, const QString &, int, const QString& connOpts){ if (isOpen()) close(); SQLRETURN r; r = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &d->hEnv); if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO) { qSqlWarning(QLatin1String("QODBCDriver::open: Unable to allocate environment"), d); setOpenError(true); return false; } r = SQLSetEnvAttr(d->hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC2, SQL_IS_UINTEGER); r = SQLAllocHandle(SQL_HANDLE_DBC, d->hEnv, &d->hDbc); if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO) { qSqlWarning(QLatin1String("QODBCDriver::open: Unable to allocate connection"), d); setOpenError(true); return false; } if (!d->setConnectionOptions(connOpts)) return false; // Create the connection string QString connQStr; // support the "DRIVER={SQL SERVER};SERVER=blah" syntax if (db.contains(QLatin1String(".dsn"))) connQStr = QLatin1String("FILEDSN=") + db; else if (db.contains(QLatin1String("DRIVER")) || db.contains(QLatin1String("SERVER"))) connQStr = db; else connQStr = QLatin1String("DSN=") + db; connQStr += QLatin1String(";UID=") + user + QLatin1String(";PWD=") + password; SQLSMALLINT cb;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -