江麒麟
新手
新手
  • UID575
  • 粉丝0
  • 关注0
  • 发帖数10
阅读:8626回复:0

Qt5.0 以上版本 Oracle数据库以及sqlite数据库使用

楼主#
更多 发布于:2019-05-27 18:37
Qt平台C++使用数据库


1       开发平台


Windows 10pro 64bit、Qt 5.10.1 32bit、Oracle 11g。

2       数据库驱动编译


在Qt 5.10.1版本中,安装后就支持的驱动(《QSQLITE》,《QMYSQL》,
《QMYSQL3》,《QODBC》,《QODBC3》,《QPSQL》,《QPSQL7》)。下面以编译QOCI驱动为例。


2.1   安装Qt开发软件


安装Qt5.10.1(如图:记得勾选源代码安装);我的安装路径(D:\Qt\Qt5.10.1)。

图片:1.png


下载链接:https://pan.baidu.com/s/1kCsJBGP28sNEPLQZQdeBkw 提取码:3shp

2.2   安装Oracle客户端

下载链接:https://pan.baidu.com/s/1jIZK3PDvcMsUofhfoczmeg 提取码:ywla
安装Oracle客户端时,我的安装路径(D:\app\SSK\product\11.2.0\
client_1);


3       ORCL数据库驱动编译

打开Qt安装目录下的OCI工程,路径(D:\Qt\Qt5.10.1\5.10.1
\Src\ qtbase\src\plugins\sqldrivers\oci),直接编译结果: Library 'oci&' is not defined.。使用vc编译的将源文件中的QMAKE_USE += oci改为QMAKE_LFLAGS +=oci.lib,使用gcc编译的改为QMAKE_LFLAGS +=oci.dll。注:QMAKE_LFLAGS的意思是指定依赖库的路径。
我用的是MingW版本,直接添加oci.dll的绝对路径。使用QMAKE_LFLAGS +=D:\app\SSK\product\11.2.0\client_1\BIN\oci.dll。注:也可以配置Oracle客户端的环境变量。在oci.pro文件中添加头文件和库文件包含;
D:\app\SSK\product\11.2.0\client_1\oci\include
D:\app\SSK\product\11.2.0\client_1\oci\lib\msvc
Oci.pro修改后如图:

图片:2.png


重新编译通过之后,这时候我们在Qt安装的根目录下面去找 “:\plugins”会发现里面有一个“sqldrivers”文件夹,将其复制到D:\Qt\Qt5.10.1\5.10.1\mingw53_32\plugins\sqldrivers下面即可。
编译成功如图:

图片:3.png


拷贝到Qt的路径如图:

图片:4.png


已编译完成的驱动下载链接:链接,提取码:medh
数据库驱动编译:参考链接


4       数据库数据源加载


QODBC(Open Database Connectivity,开放数据库互连)是一种动态链接库(DLL)支持 ODBC 的应用程序(如Excel)可以用它来访问ODBC数据源。每个ODBC驱动程序针对一个数据库管理系统 (DBMS),如 SQL Server、Access等等。

4.1   打开添加数据源软件


使用QODBC连接Oracle数据库,需要先添加数据源。打开路径:C:\Windows\SysWOW64的odbcad32.exe,如图

图片:5.png



4.2   添加数据源


按步骤添加数据源,如图

图片:6.png

图片:7.png


就可以在Qt的C++程序里使用QODBC驱动连接oracle了。
总结:此类添加数据源的方法在发布机上连接数据库极为繁琐,需要配置数据源,才能连接Oracle数据库,并且从Oracle取得的中文数据需要从Unicode转为平台字符集UTF-8。QT使用QOCI驱动,不需要添加数据源。参考链接

5       Qt数据库使用



5.1   添加Qt使用的数据库模块


在xxx.pro工程文件中需要添加:QT += sql。

5.2   包含类库头文件


包含使用到的Qt封装好的数据库操作类如下;
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>

5.3   代码加载使用的数据库驱动


加载数据库使用的驱动
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");

5.4   设置数据库连接信息

设置数据库连接信息并打开数据库,代码示例如下
db.setHostName(host);
db.setDatabaseName(databaseName);
db.setUserName(user);
db.setPassword(pass);
db.setPort(port);
db.open();

5.5   操作数据库的方法

QSqlQuery的几个方法了解(QSqlQuery sql;)
sql.exec()执行以前准备好的SQL查询。如果查询成功执行,返回true;否则返回false。注意,当调用exec()时,此查询的最后一个错误被重置。
   sql.exec(“select * from tablename”) 执行查询中的SQL。如果查询成功,返回true,则将查询状态设置为活动状态;否则返回false。查询字符串必须使用适合查询的SQL数据库的语法(例如,标准SQL)。执行查询之后,查询定位在一个无效的记录上,必须在检索数据值之前导航到一个有效的记录(例如,使用next())。注意,当调用exec()时,此查询的最后一个错误被重置。
对于SQLite,查询字符串一次只能包含一条语句。
  sql.bindValue()函数原型void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val,
QSql::ParamType paramType = QSql::In)
将占位符设置为绑定到准备好的语句中的val值。注意占位符标记(在指定占位符名称时必须包括。如果paramType是QSql::Out或QSql::InOut,那么在执行exec()调用之后,占位符将被数据库中的数据覆盖。在这种情况下,必须预先分配足够的空间来存储结果。若要绑定空值,请使用空qvariable;例如,如果要绑定字符串,请使用qvariable (QVariant::String)。参考链接
6       完整示例

下面以Sqlite数据库为例,连接创建数据库表并插入数据;参考链接
#include <QCoreApplication>
#include <QSql>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QString>
#include <QFile>
#include <QDebug>
#include <QVariantList>

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
     database.setDatabaseName("CashSystem.db");

   if(database.open())
   {
       qDebug()<<"Database Opened";

       QSqlQuery sql_query;
       QString create_sql = "create table
member (id int primary key, name varchar(30), address varchar(30))"; //
创建数据表
       QString insert_sql = "insert into
member values(?,?,?)";    //
插入数据

       QString select_all_sql = "select *
from member";


       sql_query.prepare(create_sql); //创建表
       if(!sql_query.exec()) //查看创建表是否成功
       {
          qDebug() << QObject::tr("Table Create failed");
              qDebug() << sql_query.lastError();
       }
       else
       {
           qDebug()<< "Table Created";
           //插入数据
           sql_query.prepare(insert_sql);
           QVariantList GroupIDs;
           GroupIDs.append(0);
           GroupIDs.append(1);
           GroupIDs.append(2);
           QVariantList GroupNames;
           GroupNames.append("Oracle");
           GroupNames.append("Mysql");
           GroupNames.append("Sqlite");
           QVariantList GroupAddress;
           GroupAddress.append("上海");
           GroupAddress.append("北京");
           GroupAddress.append("深圳");

           sql_query.addBindValue(GroupIDs);
           sql_query.addBindValue(GroupNames);
           sql_query.addBindValue(GroupAddress);

           if(!sql_query.execBatch())
           {
             
qDebug()&lt;&lt;sql_query.lastError();

           }
           else
           {
               qDebug()&lt;&lt;&quot;插入记录成功&quot;;
           }

           //查询所有记录
           sql_query.prepare(select_all_sql);
           if(!sql_query.exec())
           {
              qDebug() << sql_query.lastError();
           }
           else
           {
               while(sql_query.next())
               {
                   int id = sql_query.value(0).toInt();
                   QString name =sql_query.value(1).toString();
                   QString address =sql_query.value(2).toString();
                  qDebug()<<QString("ID:%1Name:%2  Address:%3").arg(id).arg(name).arg(address);
               }
           }
       }
   }
   database.close();
  // QFile::remove("CashSystem.db");
   return a.exec();
}
[江麒麟于2019-05-30 09:58编辑了帖子]
游客

返回顶部