Qt5_Oracle
1、编译驱动:
1.1、源码路径:F:\ZC_software_installDir\Qt5.3.2_vs2010\5.3\Src\qtbase\src\plugins\sqldrivers\ 里面有一些主流数据库的驱动源码,Oracle对应的是 文件夹"oci"
1.1.1、我将 文件夹"oci" 复制出来 ==> 不能这样编译,貌似 有需要别的东西
1.1.2、编译好的 .dll等文件,并不是 位于 路径"F:\ZC_software_installDir\Qt5.3.2_vs2010\5.3\Src\qtbase\src\plugins"下,而是 在"F:\plugins\sqldrivers"中...
1.2、编译时需要用到 Oracle的一些文件,需要在 oci.pro中添加如下内容:
- INCLUDEPATH += F:\oracle\product\10.2.0\db_1\oci\include
- LIBPATH += F:\oracle\product\10.2.0\db_1\oci\lib\msvc
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:\plugins\sqldrivers #ZC: 编译时需要的lib文件的路径
2.2、qt.conf
- [Paths]
- plugins = ./plugins
ZC: 这里的意思是:插件的目录是 exe所在路径\plugin。于是Qt for Oracle 的驱动全文件名就是:exe所在路径\plugins\sqldrivers\qsqloci.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!\n");
- return ;
- }
- //QCoreApplication::addLibraryPath("F:\\plugins");
- //*
- // ZC: 这个是,Qt for Oracle的驱动dll
- // ZC: 这里是手动加载 qsqloci.dll
- // ZC: 将qsqloci.dll放在目录"F:\ZC_software_installDir\Qt5.3.2_vs2010\5.3\msvc2010_opengl\plugins\sqldrivers"中的话,会自动加载
- // 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!\n");
- return ;
- }
- //*/
- 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();
- bool bRet = sqldb.open();
- if (sqldb.isOpen())
- bRet = true;
- if (! bRet)
- {
- qDebug() << "Oracle open failed : "+sqldb.lastError().text();
- return ;
- }
- 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() + );
- // 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:\ZC_software_installDir\Qt5.3.2_vs2010\5.3\msvc2010_opengl\plugins\sqldrivers
./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:\oracle\product\10.2.0\client_1\BIN。
6.1.2、代码中 使用QLibrary 加载oci.dll
6.2、qsqloci.dll 必须要加载
这里的具体做法 参考上面的"5"
7、
8、
Qt5_Oracle的更多相关文章
随机推荐
- 机器学习理论基础学习4--- SVM(基于结构风险最小化)
一.什么是SVM? SVM(Support Vector Machine)又称为支持向量机,是一种二分类的模型.当然如果进行修改之后也是可以用于多类别问题的分类.支持向量机可以分为线性和非线性两大类. ...
- eigen quick reference
参考: http://eigen.tuxfamily.org/dox/AsciiQuickReference.txt // A simple quickref for Eigen. Add anyth ...
- jquery 的each函数
each函数经常用到.它本身就是一个循环遍历 你可以可以break continue 但这是在for while循环中 each中我们可以这样 下面的例子是遍历 MyTable中所有的tr 第一个td ...
- Vue.Js添加自定义插件
基于上篇我们讲了 在window下搭建Vue.Js开发环境 我们可以开发自己的vue.js插件发布到npm上,供大家下载使用. 1.首先打开cmd命令窗口,进入我们的工作目录下 执行 cd E:\vu ...
- #C++初学记录(算法4)
A - Serval and Bus It is raining heavily. But this is the first day for Serval, who just became 3 ye ...
- VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)
上一节中鸡啄米主要讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. 鸡啄米依然是通过实例的方式来说明画刷的用法.此实例要实现的功能是,对话框上有一 ...
- Python: re.compile()
compile(pattern,flags=0) 1.编译一个正则表达式模式,返回一个模式对象 2.第二个参数flags是匹配模式,可以使用按位或‘|'表示同时生效,也可以在正则表达式字符串中指定 P ...
- C++ Word Count 发布程序
前段时间,模仿 Linux 系统下的 wc 程序,在 Windows 系统环境下使用 C/C++ 实现了一个相似的 WC 程序,只不过有针对性,针对的是 C/C++,Java 等风格的源代码文件. 此 ...
- C/C++之内存分配
一.编译时与运行时的内存情况1.编译时不分配内存编译时是不分配内存的.此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确.所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误.2 ...
- DBCP、c3p0、Druid三大连接池区别
DBCP.c3p0.Druid三大连接池区别 一.连接池优势 如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源: 如果创建一个池,用池来管理Connection,这样就可以 ...