阅读:8626回复:0
Qt5.0 以上版本 Oracle数据库以及sqlite数据库使用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()<<sql_query.lastError(); } else { qDebug()<<"插入记录成功"; } //查询所有记录 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编辑了帖子]
|
|