qt使用QOCI或者QACI连接神通数据库

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

猜你喜欢

转载自blog.csdn.net/qq_40382029/article/details/136190993