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的更多相关文章

随机推荐

  1. selenium webdriver窗口切换(下)

    多窗口切换有时候需要在不同的窗口切换,从而操作不同的窗口上的元素.在selenium1.0 中这个问题比较难处理.但WebDriver 提供了switcTo.window()方法可以切换到任意的窗口. ...

  2. .NET MVC model数据验证

    MVC提供了很方便的数据验证,只需要在model里加入相关的正则等,那么就会在前台里生成相关的验证脚本.需要引用两个js文件: jquery.validate.min.js jquery.valida ...

  3. 7.8 Models -- The Rest Adapter

    一.概述 默认的,store将会使用 DS.RESTAdapter来加载和存储records.这个RESTAdapter假定URLS和JSON关联每一个model是约定好的:这意味着,如果你遵循这个规 ...

  4. Webform和MVC,为什么MVC更好一些?(转)

    转自http://www.admin10000.com/document/5277.html 前言 如果你看了最近微软的议程,你会发现他们现在的焦点除了MVC,还是MVC.问题在于为什么微软如此热衷于 ...

  5. 020-安装centos6.5后的生命历程

    01.配置网络.修改了ifcfg-eth0文件内容. 1)ifcfg-eth0原来的内容如下: 2)ifcfg-eth0配置后的内容如下:   3)然后重启网络服务: 4)测试网络是否可通: 5)查看 ...

  6. Atcoder Tenka1 Programmer Contest 2019 E - Polynomial Divisors

    题意: 给出一个多项式,问有多少个质数\(p\)使得\(p\;|\;f(x)\),不管\(x\)取何值 思路: 首先所有系数的\(gcd\)的质因子都是可以的. 再考虑一个结论,如果在\(\bmod ...

  7. 本地缓存之GUAVA

    项目开发中,很多配置数据需要缓存,一般来说,开发人员都会手动写HashMap,HashSet或者ConcurrentHashMap,ConcurrentHashSet缓存数据,但是这样的缓存往往存在内 ...

  8. linux常用命令:ifconfig 命令

    许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...

  9. php CI框架实现验证码功能和增强验证码安全性实战教程

    php CI框架实现验证码功能和增强验证码安全性实战教程 CodeIgniter简称CI是最流行的一个php MVC框架之一,本人讲从实际项目使用中写系列实战经验,有别与其他的理论讲解文章,会附上实战 ...

  10. C/C++笔记 #035# Makefile

    相关资料: Understanding roles of CMake, make and GCC GCC and Make ( A simple tutorial, teaches u how to ...