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、