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中添加如下内容:

  1. INCLUDEPATH += F:\oracle\product\10.2.0\db_1\oci\include
  2. LIBPATH += F:\oracle\product\10.2.0\db_1\oci\lib\msvc

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

  2.1、?.pro

  1. #-------------------------------------------------
  2. #
  3. # Project created by QtCreator 2016-07-07T13:22:41
  4. #
  5. #-------------------------------------------------
  6.  
  7. QT += core \
  8. sql #ZC: 要加上这个
  9.  
  10. QT -= gui
  11.  
  12. TARGET = Qt5_DB_Test
  13. CONFIG += console
  14. CONFIG -= app_bundle
  15.  
  16. TEMPLATE = app
  17.  
  18. SOURCES += main.cpp
  19.  
  20. LIBPATH += F:\plugins\sqldrivers #ZC: 编译时需要的lib文件的路径
  1.  

  2.2、qt.conf

  1. [Paths]
  2. plugins = ./plugins

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

  2.3、main.cpp

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3.  
  4. #include <QLibrary>
  5. #include <QLibraryInfo>
  6.  
  7. #include <QtSql/QSqlDatabase>
  8. #include <QtSql/QSqlQuery>
  9. #include <QtSql/QSqlrecord>
  10. #include <QtSql/QSqlError>
  11. #include <QtSql/QSqlDriver>
  12.  
  13. #define DB_DRIVER "QOCI"
  14. #define DB_HOSTNAME "192.168.1.201"
  15. #define DB_DATABASENAME "ZHEJIANG" // ZC: 这里填的是 SID
  16. #define DB_USERNAME "testWFpas"
  17. #define DB_PASSWORD "dongruisoft.com"
  18.  
  19. #pragma comment(lib, "qsqloci.lib")
  20.  
  21. int main(int argc, char *argv[])
  22. {
  23. QCoreApplication a(argc, argv);
  24.  
  25. qDebug() << "QLibraryInfo::PrefixPath : " << QLibraryInfo::location(QLibraryInfo::PrefixPath);
  26. qDebug() << "QLibraryInfo::DocumentationPath : " << QLibraryInfo::location(QLibraryInfo::DocumentationPath);
  27. qDebug() << "QLibraryInfo::HeadersPath : " << QLibraryInfo::location(QLibraryInfo::HeadersPath);
  28. qDebug() << "QLibraryInfo::LibrariesPath : " << QLibraryInfo::location(QLibraryInfo::LibrariesPath);
  29. qDebug() << "QLibraryInfo::LibraryExecutablesPath : " << QLibraryInfo::location(QLibraryInfo::LibraryExecutablesPath);
  30. qDebug() << "QLibraryInfo::BinariesPath : " << QLibraryInfo::location(QLibraryInfo::BinariesPath);
  31. qDebug() << "QLibraryInfo::PluginsPath : " << QLibraryInfo::location(QLibraryInfo::PluginsPath);
  32. qDebug() << "QLibraryInfo::ImportsPath : " << QLibraryInfo::location(QLibraryInfo::ImportsPath);
  33. qDebug() << "QLibraryInfo::Qml2ImportsPath : " << QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath);
  34. qDebug() << "QLibraryInfo::ArchDataPath : " << QLibraryInfo::location(QLibraryInfo::ArchDataPath);
  35. qDebug() << "QLibraryInfo::DataPath : " << QLibraryInfo::location(QLibraryInfo::DataPath);
  36. qDebug() << "QLibraryInfo::TranslationsPath : " << QLibraryInfo::location(QLibraryInfo::TranslationsPath);
  37. qDebug() << "QLibraryInfo::ExamplesPath : " << QLibraryInfo::location(QLibraryInfo::ExamplesPath);
  38. qDebug() << "QLibraryInfo::TestsPath : " << QLibraryInfo::location(QLibraryInfo::TestsPath);
  39. qDebug() << "QLibraryInfo::SettingsPath : " << QLibraryInfo::location(QLibraryInfo::SettingsPath);
  40. qDebug() << "";
  41.  
  42. // ZC: 这个是,Oracle自带的驱动dll
  43. //写清楚库的路径,如果放在当前工程的目录下,路径为./Oracle.so
  44. QLibrary *libOCI = new QLibrary("F:\\oracle\\product\\10.2.0\\db_1\\bin\\oci.dll");
  45. //加载动态库
  46. libOCI->load();
  47. if (!libOCI->isLoaded())
  48. {
  49. printf("Load Oracle oci.dll failed!\n");
  50. return ;
  51. }
  52.  
  53. //QCoreApplication::addLibraryPath("F:\\plugins");
  54. //*
  55. // ZC: 这个是,Qt for Oracle的驱动dll
  56. // ZC: 这里是手动加载 qsqloci.dll
  57. // ZC: 将qsqloci.dll放在目录"F:\ZC_software_installDir\Qt5.3.2_vs2010\5.3\msvc2010_opengl\plugins\sqldrivers"中的话,会自动加载
  58. // ZC: 貌似将qsqloci.dll放在 exe同目录,也不行...
  59. QLibrary *libQSQLOCI = new QLibrary("F:\\plugins\\sqldrivers\\qsqloci.dll");
  60. libQSQLOCI->load();
  61. if (!libQSQLOCI->isLoaded())
  62. {
  63. printf("Load Qt sql driver for Oracle(qsqloci.dll) failed!\n");
  64. return ;
  65. }
  66. //*/
  67. QString strConnName = "testZC"; // ZC: 这个名字是随便填的,和Oracle的设置没有关系
  68. QSqlDatabase sqldb; // 数据库指针
  69. if (QSqlDatabase::contains(strConnName))
  70. {
  71. qDebug() << "QSqlDatabase::contains(" << strConnName << ")";
  72. sqldb = QSqlDatabase::database(strConnName);
  73. }
  74. else
  75. {
  76. qDebug() << "! QSqlDatabase::contains(" << strConnName << ")";
  77. sqldb = QSqlDatabase::addDatabase(DB_DRIVER, strConnName); // 使用Oracle数据库驱动
  78. }
  79. sqldb.setHostName(DB_HOSTNAME);
  80. sqldb.setDatabaseName(DB_DATABASENAME);
  81. sqldb.setUserName(DB_USERNAME);
  82. sqldb.setPassword(DB_PASSWORD);
  83. sqldb.setPort();
  84.  
  85. bool bRet = sqldb.open();
  86. if (sqldb.isOpen())
  87. bRet = true;
  88.  
  89. if (! bRet)
  90. {
  91. qDebug() << "Oracle open failed : "+sqldb.lastError().text();
  92. return ;
  93. }
  94. else
  95. qDebug() << "Oracle open success .";
  96.  
  97. QSqlQuery query("select * from BUS", sqldb);
  98. qDebug() << query.executedQuery();
  99. qDebug() << "Record column count : " << query.record().count();
  100. if(sqldb.driver()->hasFeature(QSqlDriver::QuerySize))
  101. {
  102. qDebug() << "QSqlDriver::QuerySize";
  103. qDebug() << " Record row count (1) : " << query.size();
  104. }
  105. else
  106. {
  107. qDebug() << "! QSqlDriver::QuerySize";
  108. query.last();
  109. qDebug() << " Record row count (2) : " << (query.at() + );
  110. // ZC: 上面已经指向最后一条记录了,要再遍历的话,要QSqlQuery.first()重新指向第1条记录了
  111. qDebug() << " query.next() : " << query.next();
  112. }
  113.  
  114. qDebug() << "";
  115. qDebug() << "isForwardOnly : " << query.isForwardOnly(); // ZC: 判断是 单向/双向?
  116. query.last();
  117. qDebug() << "Record row count (3) : " << query.numRowsAffected();
  118. // ZC: numRowsAffected()返回的是 第1条记录 到 现在所指向的记录,一共是几条记录。,∴上面 先QSqlDriver.last(),然后才能得到记录总条数
  119. // ZC: numRowsAffected() 貌似需要QSqlDriver是非单向(ForwardOnly)的
  120.  
  121. return a.exec();
  122. }

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. 机器学习理论基础学习4--- SVM(基于结构风险最小化)

    一.什么是SVM? SVM(Support Vector Machine)又称为支持向量机,是一种二分类的模型.当然如果进行修改之后也是可以用于多类别问题的分类.支持向量机可以分为线性和非线性两大类. ...

  2. eigen quick reference

    参考: http://eigen.tuxfamily.org/dox/AsciiQuickReference.txt // A simple quickref for Eigen. Add anyth ...

  3. jquery 的each函数

    each函数经常用到.它本身就是一个循环遍历 你可以可以break continue 但这是在for while循环中 each中我们可以这样 下面的例子是遍历 MyTable中所有的tr 第一个td ...

  4. Vue.Js添加自定义插件

    基于上篇我们讲了 在window下搭建Vue.Js开发环境 我们可以开发自己的vue.js插件发布到npm上,供大家下载使用. 1.首先打开cmd命令窗口,进入我们的工作目录下 执行 cd E:\vu ...

  5. #C++初学记录(算法4)

    A - Serval and Bus It is raining heavily. But this is the first day for Serval, who just became 3 ye ...

  6. VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)

    上一节中鸡啄米主要讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. 鸡啄米依然是通过实例的方式来说明画刷的用法.此实例要实现的功能是,对话框上有一 ...

  7. Python: re.compile()

    compile(pattern,flags=0) 1.编译一个正则表达式模式,返回一个模式对象 2.第二个参数flags是匹配模式,可以使用按位或‘|'表示同时生效,也可以在正则表达式字符串中指定 P ...

  8. C++ Word Count 发布程序

    前段时间,模仿 Linux 系统下的 wc 程序,在 Windows 系统环境下使用 C/C++ 实现了一个相似的 WC 程序,只不过有针对性,针对的是 C/C++,Java 等风格的源代码文件. 此 ...

  9. C/C++之内存分配

    一.编译时与运行时的内存情况1.编译时不分配内存编译时是不分配内存的.此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确.所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误.2 ...

  10. DBCP、c3p0、Druid三大连接池区别

    DBCP.c3p0.Druid三大连接池区别 一.连接池优势 如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源: 如果创建一个池,用池来管理Connection,这样就可以 ...