在软件开发过程中,数据库连接是一个非常重要的环节。神通数数据库是一款性能优秀、稳定可靠的数据库产品,而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

修改后如下:

第三步,修改main.cpp 文件,源文件如下:

修改内容:增加

|| name == QLatin1String("QACI")

修改后如下:

第四步 ,修改qsql_oci.cpp文件,源码如下:

去掉头文件和修改连接方式:

#include QString::fromLatin1("%1:%2/%3").arg(hostname).arg((port > -1 " />第五步,修改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 #include #include #include #include #include #include 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 dataQSqlQuery 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 dataQSqlQuery 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 dataQSqlQuery 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 dataQSqlQuery 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驱动的教程了。