⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qsql_odbc.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                                      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 + -