亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? qsql_odbc.cpp

?? QT 開發環境里面一個很重要的文件
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the QtSql module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qsql_odbc.h"#include <qsqlrecord.h>#if defined (Q_OS_WIN32)#include <qt_windows.h>#endif#include <qcoreapplication.h>#include <qvariant.h>#include <qdatetime.h>#include <qsqlerror.h>#include <qsqlfield.h>#include <qsqlindex.h>#include <qstringlist.h>#include <qvarlengtharray.h>#include <qvector.h>#include <string.h>// undefine this to prevent initial check of the ODBC driver#define ODBC_CHECK_DRIVER#if defined(Q_ODBC_VERSION_2)//crude hack to get non-unicode capable driver managers to work# undef UNICODE# define SQLTCHAR SQLCHAR# define SQL_C_WCHAR SQL_C_CHAR#endif// newer platform SDKs use SQLLEN instead of SQLINTEGER#if defined(SQLLEN) || defined(Q_OS_WIN64)# define QSQLLEN SQLLEN#else# define QSQLLEN SQLINTEGER#endif#if defined(SQLULEN) || defined(Q_OS_WIN64)# define QSQLULEN SQLULEN#else# define QSQLULEN SQLUINTEGER#endifstatic const int COLNAMESIZE = 256;//Map Qt parameter types to ODBC typesstatic const SQLSMALLINT qParamType[4] = { SQL_PARAM_INPUT, SQL_PARAM_INPUT, SQL_PARAM_OUTPUT, SQL_PARAM_INPUT_OUTPUT };class QODBCDriverPrivate{public:    QODBCDriverPrivate()    : hEnv(0), hDbc(0), useSchema(false)    {        sql_char_type = sql_varchar_type = sql_longvarchar_type = QVariant::ByteArray;        unicode = false;    }    SQLHANDLE hEnv;    SQLHANDLE hDbc;    uint unicode :1;    uint useSchema :1;    QVariant::Type sql_char_type;    QVariant::Type sql_varchar_type;    QVariant::Type sql_longvarchar_type;    bool checkDriver() const;    void checkUnicode();    void checkSchemaUsage();    bool setConnectionOptions(const QString& connOpts);    void splitTableQualifier(const QString &qualifier, QString &catalog,                             QString &schema, QString &table);};class QODBCPrivate{public:    QODBCPrivate()    : hEnv(0), hDbc(0), hStmt(0), useSchema(false)    {        sql_char_type = sql_varchar_type = sql_longvarchar_type = QVariant::ByteArray;        unicode = false;    }    inline void clearValues()    { fieldCache.fill(QVariant()); fieldCacheIdx = 0; }    SQLHANDLE hEnv;    SQLHANDLE hDbc;    SQLHANDLE hStmt;    uint unicode :1;    uint useSchema :1;    QVariant::Type sql_char_type;    QVariant::Type sql_varchar_type;    QVariant::Type sql_longvarchar_type;    QSqlRecord rInf;    QVector<QVariant> fieldCache;    int fieldCacheIdx;};static QString qWarnODBCHandle(int handleType, SQLHANDLE handle, int *nativeCode = 0){    SQLINTEGER nativeCode_ = 0;    SQLSMALLINT msgLen = 0;    SQLRETURN r = SQL_ERROR;    SQLTCHAR state_[SQL_SQLSTATE_SIZE+1];    SQLTCHAR description_[SQL_MAX_MESSAGE_LENGTH + 1];    description_[0] = 0;    r = SQLGetDiagRec(handleType,                         handle,                         1,                         (SQLTCHAR*)state_,                         &nativeCode_,                         (SQLTCHAR*)description_,                         SQL_MAX_MESSAGE_LENGTH, /* in bytes, not in characters */                         &msgLen);    description_[SQL_MAX_MESSAGE_LENGTH] = 0;    if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) {        if (nativeCode)            *nativeCode = nativeCode_;#ifdef UNICODE        return QString((const QChar*)description_, msgLen);#else        return QString::fromLocal8Bit((const char*)description_);#endif    }    return QString();}static QString qODBCWarn(const QODBCPrivate* odbc, int *nativeCode = 0){    return (qWarnODBCHandle(SQL_HANDLE_ENV, odbc->hEnv) + QLatin1String(" ")             + qWarnODBCHandle(SQL_HANDLE_DBC, odbc->hDbc) + QLatin1String(" ")             + qWarnODBCHandle(SQL_HANDLE_STMT, odbc->hStmt, nativeCode));}static QString qODBCWarn(const QODBCDriverPrivate* odbc, int *nativeCode = 0){    return (qWarnODBCHandle(SQL_HANDLE_ENV, odbc->hEnv) + QLatin1String(" ")             + qWarnODBCHandle(SQL_HANDLE_DBC, odbc->hDbc, nativeCode));}static void qSqlWarning(const QString& message, const QODBCPrivate* odbc){    qWarning("%s\tError: %s", message.toLocal8Bit().constData(),             qODBCWarn(odbc).toLocal8Bit().constData());}static void qSqlWarning(const QString &message, const QODBCDriverPrivate *odbc){    qWarning("%s\tError: %s", message.toLocal8Bit().constData(),             qODBCWarn(odbc).toLocal8Bit().constData());}static QSqlError qMakeError(const QString& err, QSqlError::ErrorType type, const QODBCPrivate* p){    int nativeCode = -1;    QString message = qODBCWarn(p, &nativeCode);    return QSqlError(QLatin1String("QODBC3: ") + err, message, type, nativeCode);}static QSqlError qMakeError(const QString& err, QSqlError::ErrorType type,                            const QODBCDriverPrivate* p){    int nativeCode = -1;    QString message = qODBCWarn(p, &nativeCode);    return QSqlError(QLatin1String("QODBC3: ") + err, qODBCWarn(p), type, nativeCode);}template<class T>static QVariant::Type qDecodeODBCType(SQLSMALLINT sqltype, const T* p){    QVariant::Type type = QVariant::Invalid;    switch (sqltype) {    case SQL_DECIMAL:    case SQL_NUMERIC:    case SQL_REAL:    case SQL_FLOAT:    case SQL_DOUBLE:        type = QVariant::Double;        break;    case SQL_SMALLINT:    case SQL_INTEGER:    case SQL_BIT:    case SQL_TINYINT:        type = QVariant::Int;        break;    case SQL_BIGINT:        type = QVariant::LongLong;        break;    case SQL_BINARY:    case SQL_VARBINARY:    case SQL_LONGVARBINARY:        type = QVariant::ByteArray;        break;    case SQL_DATE:    case SQL_TYPE_DATE:        type = QVariant::Date;        break;    case SQL_TIME:    case SQL_TYPE_TIME:        type = QVariant::Time;        break;    case SQL_TIMESTAMP:    case SQL_TYPE_TIMESTAMP:        type = QVariant::DateTime;        break;#ifndef Q_ODBC_VERSION_2    case SQL_WCHAR:    case SQL_WVARCHAR:    case SQL_WLONGVARCHAR:        type = QVariant::String;        break;#endif    case SQL_CHAR:        type = p->sql_char_type;        break;    case SQL_VARCHAR:        type = p->sql_varchar_type;        break;    case SQL_LONGVARCHAR:        type = p->sql_longvarchar_type;        break;    default:        type = QVariant::ByteArray;        break;    }    return type;}static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool unicode = false){    QString fieldVal;    SQLRETURN r = SQL_ERROR;    QSQLLEN lengthIndicator = 0;    // NB! colSize must be a multiple of 2 for unicode enabled DBs    if (colSize <= 0) {        colSize = 256;    } else if (colSize > 65536) { // limit buffer size to 64 KB        colSize = 65536;    } else {        colSize++; // make sure there is room for more than the 0 termination        if (unicode) {            colSize *= 2; // a tiny bit faster, since it saves a SQLGetData() call        }    }    char* buf = new char[colSize];    while (true) {        r = SQLGetData(hStmt,                        column+1,                        unicode ? SQL_C_WCHAR : SQL_C_CHAR,                        (SQLPOINTER)buf,                        colSize,                        &lengthIndicator);        if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) {            if (lengthIndicator == SQL_NULL_DATA || lengthIndicator == SQL_NO_TOTAL) {                fieldVal = QString();                break;            }            // if SQL_SUCCESS_WITH_INFO is returned, indicating that            // more data can be fetched, the length indicator does NOT            // contain the number of bytes returned - it contains the            // total number of bytes that CAN be fetched            // colSize-1: remove 0 termination when there is more data to fetch            int rSize = (r == SQL_SUCCESS_WITH_INFO) ? (unicode ? colSize-2 : colSize-1) : lengthIndicator;            if (unicode) {                fieldVal += QString((QChar*) buf, rSize / 2);            } else {                buf[rSize] = 0;                fieldVal += QString::fromAscii(buf);            }            if (lengthIndicator < colSize) {                // workaround for Drivermanagers that don't return SQL_NO_DATA                break;            }        } else if (r == SQL_NO_DATA) {            break;        } else {            qWarning("qGetStringData: Error while fetching data (%d)", r);            fieldVal = QString();            break;        }    }    delete[] buf;    return fieldVal;}static QVariant qGetBinaryData(SQLHANDLE hStmt, int column){    QByteArray fieldVal;    SQLSMALLINT colNameLen;    SQLSMALLINT colType;    QSQLULEN colSize;    SQLSMALLINT colScale;    SQLSMALLINT nullable;    QSQLLEN lengthIndicator = 0;    SQLRETURN r = SQL_ERROR;    SQLTCHAR colName[COLNAMESIZE];    r = SQLDescribeCol(hStmt,                       column + 1,                       colName,                       COLNAMESIZE,                       &colNameLen,                       &colType,                       &colSize,                       &colScale,                       &nullable);    if (r != SQL_SUCCESS)        qWarning("qGetBinaryData: Unable to describe column %d", column);    // SQLDescribeCol may return 0 if size cannot be determined    if (!colSize)        colSize = 255;    else if (colSize > 65536) // read the field in 64 KB chunks        colSize = 65536;    fieldVal.resize(colSize);    ulong read = 0;    while (true) {        r = SQLGetData(hStmt,                        column+1,                        SQL_C_BINARY,                        (SQLPOINTER)(fieldVal.constData() + read),                        colSize,                        &lengthIndicator);        if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO)            break;        if (lengthIndicator == SQL_NULL_DATA)            return QVariant(QVariant::ByteArray);        if (lengthIndicator > QSQLLEN(colSize) || lengthIndicator == SQL_NO_TOTAL) {            read += colSize;            colSize = 65536;        } else {            read += lengthIndicator;        }        if (r == SQL_SUCCESS) { // the whole field was read in one chunk            fieldVal.resize(read);            break;        }        fieldVal.resize(fieldVal.size() + colSize);    }    return fieldVal;}static QVariant qGetIntData(SQLHANDLE hStmt, int column){    SQLINTEGER intbuf = 0;    QSQLLEN lengthIndicator = 0;    SQLRETURN r = SQLGetData(hStmt,                              column+1,                              SQL_C_SLONG,                              (SQLPOINTER)&intbuf,                              0,                              &lengthIndicator);    if ((r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO) || lengthIndicator == SQL_NULL_DATA) {        return QVariant(QVariant::Int);    }    return QVariant(int(intbuf));}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲香肠在线观看| 亚洲同性同志一二三专区| 日韩综合在线视频| 日韩一卡二卡三卡四卡| 精久久久久久久久久久| 日本一区二区免费在线观看视频| 国产成人久久精品77777最新版本| 久久美女高清视频| kk眼镜猥琐国模调教系列一区二区| 国产精品久久免费看| 色成年激情久久综合| 午夜精品福利在线| 欧美刺激午夜性久久久久久久 | 亚洲品质自拍视频| 欧美日韩在线播| 国产一区二区视频在线| 欧美国产激情二区三区| 91久久一区二区| 秋霞电影网一区二区| 欧美精品一区在线观看| 99精品视频一区二区| 天天操天天色综合| 国产欧美日韩精品a在线观看| 色综合网站在线| 麻豆中文一区二区| 亚洲欧美一区二区在线观看| 欧美区在线观看| 国产精品亚洲а∨天堂免在线| 亚洲免费av网站| 精品国产污污免费网站入口 | 欧美探花视频资源| 美女视频免费一区| 亚洲欧洲日产国码二区| 日韩一级二级三级精品视频| 国产传媒久久文化传媒| 日韩电影在线一区二区三区| 中文字幕乱码亚洲精品一区| 欧美精品色综合| 成人免费毛片嘿嘿连载视频| 日av在线不卡| 亚洲免费在线观看视频| 2020国产精品自拍| 欧美日韩一二三区| 国产91清纯白嫩初高中在线观看 | 一区二区三区在线播| 精品国产乱码91久久久久久网站| 在线视频国内一区二区| 国产乱人伦偷精品视频不卡| 亚洲二区在线视频| 国产精品第四页| 欧美精品一区二区三区蜜桃视频| 欧洲在线/亚洲| 成人av在线影院| 国产伦精品一区二区三区视频青涩 | 日韩专区中文字幕一区二区| 国产精品毛片高清在线完整版| 日韩一级完整毛片| 欧美日韩精品欧美日韩精品一综合| 成人午夜碰碰视频| 国产精品一区一区| 精品中文字幕一区二区小辣椒| 亚洲永久免费av| 亚洲欧美另类在线| 中文一区在线播放| 久久久久久久久久看片| 日韩欧美国产系列| 91精品在线一区二区| 欧美午夜宅男影院| 一本到不卡精品视频在线观看| 成人深夜福利app| 国产成人亚洲精品青草天美| 精品写真视频在线观看| 亚洲图片欧美激情| www日韩大片| 91亚洲国产成人精品一区二区三| 亚洲国产一区二区在线播放| 欧美大片在线观看一区| 国产999精品久久久久久绿帽| 中文字幕亚洲欧美在线不卡| 一本色道亚洲精品aⅴ| 麻豆精品新av中文字幕| 亚洲欧美激情插 | 粉嫩aⅴ一区二区三区四区五区| 欧美日韩国产成人在线免费| 91国偷自产一区二区三区成为亚洲经典| 成人黄色片在线观看| 波多野结衣中文字幕一区| 97精品国产露脸对白| 在线亚洲一区二区| 欧美精品精品一区| 日韩美女在线视频| 亚洲国产成人在线| 亚洲欧美日韩中文播放| 亚洲国产另类av| 免费一级片91| 国产曰批免费观看久久久| 丁香婷婷深情五月亚洲| 91啦中文在线观看| 5858s免费视频成人| 2024国产精品视频| 日韩理论在线观看| 午夜不卡在线视频| 国产在线精品免费| 91麻豆免费观看| 日韩一区二区免费电影| 国产亚洲美州欧州综合国| 日韩一区日韩二区| 秋霞av亚洲一区二区三| 国产成人免费在线视频| 色94色欧美sute亚洲线路一ni| 欧美午夜视频网站| 久久综合九色欧美综合狠狠| 亚洲色图制服诱惑| 日韩精品成人一区二区三区| 激情欧美一区二区三区在线观看| 成人激情开心网| 91精品欧美综合在线观看最新| 国产亚洲精品资源在线26u| 亚洲一区二区欧美激情| 国产精品 日产精品 欧美精品| 日本精品一区二区三区高清| 精品国产一区二区三区四区四 | 日本高清不卡在线观看| 欧美一区二区三区啪啪| 国产精品久线在线观看| 毛片av一区二区三区| 日本韩国欧美在线| 久久久久久久综合狠狠综合| 香蕉久久一区二区不卡无毒影院 | 欧美视频一区二区三区四区| 26uuu色噜噜精品一区二区| 一区二区在线观看视频| 国产麻豆9l精品三级站| 欧美精品自拍偷拍动漫精品| 国产精品无圣光一区二区| 首页国产丝袜综合| 色婷婷综合久久| 国产日产欧美精品一区二区三区| 亚洲sss视频在线视频| 99久久免费视频.com| 精品国产91久久久久久久妲己| 亚洲成人综合在线| av影院午夜一区| 久久精品日韩一区二区三区| 日本特黄久久久高潮| 欧美日韩精品系列| 一区二区三区产品免费精品久久75| 国产一区二区免费看| 69堂精品视频| 午夜精品久久久久久久| 欧洲一区在线电影| 日韩理论片中文av| av动漫一区二区| 日本一区二区三区视频视频| 国产在线不卡一卡二卡三卡四卡| 91精品国产综合久久精品图片| 一区二区高清免费观看影视大全 | 欧美自拍偷拍午夜视频| 国产精品国产a| 成人美女在线观看| 日本一区二区视频在线| 国产精品18久久久久久久久久久久| 日韩免费观看高清完整版| 天堂影院一区二区| 3d成人h动漫网站入口| 图片区小说区国产精品视频| 在线视频欧美精品| 亚洲国产aⅴ天堂久久| 91黄色免费观看| 亚洲亚洲人成综合网络| 欧美区一区二区三区| 丝袜诱惑亚洲看片| 日韩亚洲欧美综合| 韩国精品主播一区二区在线观看 | 丰满亚洲少妇av| 欧美国产欧美综合| 99国产精品久久久久久久久久久 | 91精品国产美女浴室洗澡无遮挡| 五月天久久比比资源色| 在线成人小视频| 久久97超碰国产精品超碰| 精品国产青草久久久久福利| 国产精品一区二区三区四区 | 一区二区三区中文在线| 91激情五月电影| 日韩精品乱码免费| 精品成人免费观看| 懂色av一区二区三区蜜臀| 中文字幕综合网| 欧美精品123区| 国内精品写真在线观看| 国产精品久久三区| 欧美日韩精品欧美日韩精品一 | 首页国产欧美日韩丝袜| 久久久久久久久蜜桃| 色欧美片视频在线观看在线视频| 午夜精品久久久久久久99水蜜桃| 久久综合九色综合欧美98| 99这里只有久久精品视频| 丝瓜av网站精品一区二区|