zoukankan      html  css  js  c++  java
  • Qt5_Oracle

    1、编译驱动:

      1.1、源码路径:F:C_software_installDirQt5.3.2_vs20105.3Srcqtbasesrcpluginssqldrivers 里面有一些主流数据库的驱动源码,Oracle对应的是 文件夹"oci"

        1.1.1、我将 文件夹"oci" 复制出来 ==> 不能这样编译,貌似 有需要别的东西

        1.1.2、编译好的 .dll等文件,并不是 位于 路径"F:C_software_installDirQt5.3.2_vs20105.3Srcqtbasesrcplugins"下,而是 在"F:pluginssqldrivers"中...

      1.2、编译时需要用到 Oracle的一些文件,需要在 oci.pro中添加如下内容:

    INCLUDEPATH += F:oracleproduct10.2.0db_1ociinclude
    LIBPATH += F:oracleproduct10.2.0db_1ocilibmsvc

    2、测试代码:(QT 控制台程序)

      2.1、?.pro

    #-------------------------------------------------
    #
    # Project created by QtCreator 2016-07-07T13:22:41
    #
    #-------------------------------------------------
    
    QT       += core    
                sql #ZC: 要加上这个
    
    QT       -= gui
    
    TARGET = Qt5_DB_Test
    CONFIG   += console
    CONFIG   -= app_bundle
    
    TEMPLATE = app
    
    
    SOURCES += main.cpp
    
    LIBPATH += F:pluginssqldrivers #ZC: 编译时需要的lib文件的路径
    
    

      2.2、qt.conf

    [Paths]
    plugins = ./plugins

        ZC: 这里的意思是:插件的目录是 exe所在路径plugin。于是Qt for Oracle 的驱动全文件名就是:exe所在路径pluginssqldriversqsqloci.dll

      2.3、main.cpp

    #include <QCoreApplication>
    #include <QDebug>
    
    #include <QLibrary>
    #include <QLibraryInfo>
    
    #include <QtSql/QSqlDatabase>
    #include <QtSql/QSqlQuery>
    #include <QtSql/QSqlrecord>
    #include <QtSql/QSqlError>
    #include <QtSql/QSqlDriver>
    
    #define DB_DRIVER       "QOCI"
    #define DB_HOSTNAME     "192.168.1.201"
    #define DB_DATABASENAME "ZHEJIANG"      // ZC: 这里填的是 SID
    #define DB_USERNAME     "testWFpas"
    #define DB_PASSWORD     "dongruisoft.com"
    
    #pragma comment(lib, "qsqloci.lib")
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        qDebug() << "QLibraryInfo::PrefixPath : " <<        QLibraryInfo::location(QLibraryInfo::PrefixPath);
        qDebug() << "QLibraryInfo::DocumentationPath : " << QLibraryInfo::location(QLibraryInfo::DocumentationPath);
        qDebug() << "QLibraryInfo::HeadersPath : " <<       QLibraryInfo::location(QLibraryInfo::HeadersPath);
        qDebug() << "QLibraryInfo::LibrariesPath : " <<     QLibraryInfo::location(QLibraryInfo::LibrariesPath);
        qDebug() << "QLibraryInfo::LibraryExecutablesPath : " << QLibraryInfo::location(QLibraryInfo::LibraryExecutablesPath);
        qDebug() << "QLibraryInfo::BinariesPath : " <<      QLibraryInfo::location(QLibraryInfo::BinariesPath);
        qDebug() << "QLibraryInfo::PluginsPath : " <<       QLibraryInfo::location(QLibraryInfo::PluginsPath);
        qDebug() << "QLibraryInfo::ImportsPath : " <<       QLibraryInfo::location(QLibraryInfo::ImportsPath);
        qDebug() << "QLibraryInfo::Qml2ImportsPath : " <<   QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath);
        qDebug() << "QLibraryInfo::ArchDataPath : " <<      QLibraryInfo::location(QLibraryInfo::ArchDataPath);
        qDebug() << "QLibraryInfo::DataPath : " <<          QLibraryInfo::location(QLibraryInfo::DataPath);
        qDebug() << "QLibraryInfo::TranslationsPath : " <<  QLibraryInfo::location(QLibraryInfo::TranslationsPath);
        qDebug() << "QLibraryInfo::ExamplesPath : " <<      QLibraryInfo::location(QLibraryInfo::ExamplesPath);
        qDebug() << "QLibraryInfo::TestsPath : " <<         QLibraryInfo::location(QLibraryInfo::TestsPath);
        qDebug() << "QLibraryInfo::SettingsPath : " <<      QLibraryInfo::location(QLibraryInfo::SettingsPath);
        qDebug() << "";
    
    
        // ZC: 这个是,Oracle自带的驱动dll
        //写清楚库的路径,如果放在当前工程的目录下,路径为./Oracle.so
        QLibrary *libOCI = new QLibrary("F:\oracle\product\10.2.0\db_1\bin\oci.dll");
        //加载动态库
        libOCI->load();
        if (!libOCI->isLoaded())
        {
            printf("Load Oracle oci.dll failed!
    ");
            return 0;
        }
    
        //QCoreApplication::addLibraryPath("F:\plugins");
    //*
        // ZC: 这个是,Qt for Oracle的驱动dll
        // ZC: 这里是手动加载 qsqloci.dll
        // ZC: 将qsqloci.dll放在目录"F:C_software_installDirQt5.3.2_vs20105.3msvc2010_openglpluginssqldrivers"中的话,会自动加载
        // ZC: 貌似将qsqloci.dll放在 exe同目录,也不行...
        QLibrary *libQSQLOCI = new QLibrary("F:\plugins\sqldrivers\qsqloci.dll");
        libQSQLOCI->load();
        if (!libQSQLOCI->isLoaded())
        {
            printf("Load Qt sql driver for Oracle(qsqloci.dll) failed!
    ");
            return 0;
        }
    //*/
        QString strConnName = "testZC"; // ZC: 这个名字是随便填的,和Oracle的设置没有关系
        QSqlDatabase sqldb;             // 数据库指针
        if (QSqlDatabase::contains(strConnName))
        {
            qDebug() << "QSqlDatabase::contains(" << strConnName << ")";
            sqldb = QSqlDatabase::database(strConnName);
        }
        else
        {
            qDebug() << "! QSqlDatabase::contains(" << strConnName << ")";
            sqldb = QSqlDatabase::addDatabase(DB_DRIVER, strConnName); // 使用Oracle数据库驱动
        }
        sqldb.setHostName(DB_HOSTNAME);
        sqldb.setDatabaseName(DB_DATABASENAME);
        sqldb.setUserName(DB_USERNAME);
        sqldb.setPassword(DB_PASSWORD);
                sqldb.setPort(1521);
    
        bool bRet = sqldb.open();
        if (sqldb.isOpen())
            bRet = true;
    
        if (! bRet)
        {
            qDebug() << "Oracle open failed : "+sqldb.lastError().text();
            return 0;
        }
        else
            qDebug() << "Oracle open success .";
    
        QSqlQuery query("select * from BUS", sqldb);
        qDebug() << query.executedQuery();
        qDebug() << "Record column count : " << query.record().count();
        if(sqldb.driver()->hasFeature(QSqlDriver::QuerySize))
        {
            qDebug() << "QSqlDriver::QuerySize";
            qDebug() << "   Record row count (1) : " << query.size();
        }
        else
        {
            qDebug() << "! QSqlDriver::QuerySize";
            query.last();
            qDebug() << "   Record row count (2) : " << (query.at() + 1);
            // ZC: 上面已经指向最后一条记录了,要再遍历的话,要QSqlQuery.first()重新指向第1条记录了
            qDebug() << "   query.next() : " << query.next();
        }
    
        qDebug() << "";
        qDebug() << "isForwardOnly : " << query.isForwardOnly(); // ZC: 判断是 单向/双向?
        query.last();
        qDebug() << "Record row count (3) : " << query.numRowsAffected();
        // ZC: numRowsAffected()返回的是 第1条记录 到 现在所指向的记录,一共是几条记录。,∴上面 先QSqlDriver.last(),然后才能得到记录总条数
        // ZC: numRowsAffected() 貌似需要QSqlDriver是非单向(ForwardOnly)的
    
        return a.exec();
    }

    3、路径:

    F:C_software_installDirQt5.3.2_vs20105.3msvc2010_openglpluginssqldrivers

    ./plugins/sqldrivers

    4、Qt中 插件,要放在插件指定的路径中...

      qsqloci.dll 必须放在 "??/plugins/sqldrivers"中

    5、插件路径 操作

      5.1、代码添加:

        QCoreApplication::addLibraryPath("F:\plugins");

      5.2、 qt.conf 文件指定

    6、注意点:

      6.1、oci.dll 必须要加载

        6.1.1、在系统Path 就是环境变量中添加 你的Oracle oci.dll库位置 C:oracleproduct10.2.0client_1BIN。

        6.1.2、代码中 使用QLibrary 加载oci.dll

      6.2、qsqloci.dll 必须要加载

        这里的具体做法 参考上面的"5"

    7、

    8、

  • 相关阅读:
    模糊搜索工具fzf的安装和使用
    ubuntu状态栏位置调整
    毕业相关事项
    vimium拓展程序使用技巧
    python文件生成exe可执行文件
    解决pycharm无法识别PyQt4.QtCore的问题
    pyqt4安装以及pycharm下环境配置
    动态规划——最小编辑代价
    深度学习绘图工具
    Maven Spring JUnit 在Maven Clean Install时报
  • 原文地址:https://www.cnblogs.com/cppskill/p/5649752.html
Copyright © 2011-2022 走看看