在软件开发过程中,数据库连接是一个非常重要的环节。神通数数据库是一款性能优秀、稳定可靠的数据库产品,而Qt作为一款功能强大的跨平台C++应用程序开发框架,提供了丰富的数据库连接功能。在本文中,我们将介绍如何使用Qt的QOCI或者QACI模块来连接神通数数据库,帮助开发者更好地利用这两者的优势,实现高效的数据库操作。
首先,我们将会介绍Qt中QOCI和QACI的概念和用法,然后详细讲解如何配置和连接神通数数据库。接着,我们会演示如何进行简单的数据库操作,如查询、插入、更新和删除等。最后,我们会总结本文内容,并展望未来可能的优化和拓展方向。
希望通过本文的介绍,读者能够更加深入地了解Qt与神通数数据库的结合,为自己的软件开发工作提供更多的选择和灵感。神通数数据库作为一款国产数据库产品,具有很大的发展潜力,而Qt作为一款优秀的开发工具,也能够为开发者提供更好的支持和便利。让我们一起探索这两者的结合,为软件开发带来更多可能性和机遇。
qt版本 32位/64位 | 5.12.10 |
aci版本 | V2.0.64 |
神通数据库版本 | 7.0.8 |
首先找到Qt里面的oci 的源码文件,不同的版本路径不一致,但是大致都还是一样的,以为为5.12.10为例,(D:\Qt\Qt5.12.10\5.12.10\Src\qtbase\src\plugins\sqldrivers)我们先找到oci源码文件,并且使用qtcreator打开OCI项目。
首先修改oci.pro文件,增加如下内容:
#QAMKE_USE需要注释掉
QMAKE_LFLAGS:aci的动态库文件路径(使用的是神通安装包中的aci路径)
INCLUDEPATH:aci的头文件路径
LIBPATH: aci动态库对应lib文件的存储路径
修改后如下:
第二步,修改头文件qsql_oci_p.h,修改前
修改内容:
去掉这两行
typedef struct OCIEnv OCIEnv;
typedef struct OCISvcCtx OCISvcCtx;
增加aci 库
include<aci.h>
修改后如下:
第三步,修改main.cpp 文件,源文件如下:
修改内容:增加
|| name == QLatin1String("QACI")
修改后如下:
第四步 ,修改qsql_oci.cpp文件,源码如下:
去掉头文件和修改连接方式:
#include <oci.h>
QString::fromLatin1("%1:%2/%3").arg(hostname).arg((port > -1 ? port : 2003)).arg(db);
QByteArray constrb =connectionString.toLocal8Bit();
char * constr =constrb.data();
修改后如下:
第五步,修改oci.json文件,源文件如下:
修改内容:
{
"Keys": [ "QOCI8", "QOCI","QACI" ]
}
修改后如下:
修改完毕后,保存进行编译生成。
注意:编译的方式有两种,一种是MinGW ,另外一种是MSVC,两种方式编译基本一样.
不管是哪种方式,神通的ACI 驱动位数是和kit 位数保持一致的,此时用MinGW32编译的,因此神通数据库的ACI 驱动位数用的32位的。
使用MinGW 32 位编译结果如下:
编译后生成了如下文件:
把生成的QOCI库文件和神通的aci库文件放到对应的MinGW 套件的驱动目录,目录为(D:\Qt\Qt5.12.10\5.12.10\mingw73_32\plugins\sqldrivers)
进行如下代码测试:
#include <QLibrary>
#include <stdio.h>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QCoreApplication>
int main(int argc, char *argv[])
{
qDebug()<<"开始进行连接********************";
QSqlDatabase db_st = QSqlDatabase::addDatabase("QACI");//加载QACI驱动
db_st.setPort(2003); //端口号
db_st.setHostName("192.168.1.12"); //主机地址
db_st.setDatabaseName("OSRDB"); //库名
db_st.setUserName("SYSDBA"); //用户名
db_st.setPassword("szoscar55"); //密码
//打开数据库连接
if(db_st.open()){
qDebug()<<"链接本地数据库OSRDB成功";
// Insert data
QSqlQuery insertQuery(db_st);
insertQuery.prepare("INSERT INTO table_name (column1, column2) VALUES (:value1, :value2)");
insertQuery.bindValue(":value1", "data1");
insertQuery.bindValue(":value2", "data2");
if(insertQuery.exec()){
qDebug()<<"数据插入成功";
}else{
qDebug()<<"数据插入失败";
qDebug()<<insertQuery.lastError().text();
}
// Update data
QSqlQuery updateQuery(db_st);
updateQuery.prepare("UPDATE table_name SET column1 = :newValue WHERE column2 = :oldValue");
updateQuery.bindValue(":newValue", "newData");
updateQuery.bindValue(":oldValue", "oldData");
if(updateQuery.exec()){
qDebug()<<"数据更新成功";
}else{
qDebug()<<"数据更新失败";
qDebug()<<updateQuery.lastError().text();
}
// Delete data
QSqlQuery deleteQuery(db_st);
deleteQuery.prepare("DELETE FROM table_name WHERE column1 = :value");
deleteQuery.bindValue(":value", "dataToDelete");
if(deleteQuery.exec()){
qDebug()<<"数据删除成功";
}else{
qDebug()<<"数据删除失败";
qDebug()<<deleteQuery.lastError().text();
}
// Query data
QSqlQuery selectQuery("SELECT * FROM table_name", db_st);
if(selectQuery.exec()){
while(selectQuery.next()){
QString column1Value = selectQuery.value(0).toString();
QString column2Value = selectQuery.value(1).toString();
qDebug()<< "Column1: " << column1Value << " Column2: " << column2Value;
}
}else{
qDebug()<<"查询数据失败";
qDebug()<<selectQuery.lastError().text();
}
db_st.close(); // Close the database connection
}else{
qDebug()<<"链接本地数据库OSRDB失败";
QSqlError error = db_st.lastError();
qDebug()<< error.databaseText();
qDebug()<< error.driverText();
return 0;
}
}
运行结果和数据库运行日志:
如果使用MSVC编译的话,就把oci.pro 里面的ACI 库文件换一下就行
还是把生成的QOCI和神通的ACI 库文件放到MSVC的kit套件的驱动目录下
运行结果如下:
以上就是QT 编译QACI 驱动的教程了。