windows系统使用C++ QT使用ocilib方式连接Oracle数据库

(*****特别声明-以下方式只能在单线程中使用,多线程中由于oci连接Oracle机制问题, Free数据库连接时会出现释放错误问题,想要在多线程中使用需要额外对以下方式进行封装!)
直接上源码
在工程属性中包含include和lib文件,32位包含lib32,64位包含lib64.
链接器-输入 添加 ociliba.lib ocilibw.lib
由于连接是用mfc的函数,所以在常规里面需要将MFC的使用一栏调成“在共享DLL中使用MFC”
在这里插入图片描述
最后将动态库文件复制到工程目录下,否则回提示找不到动态库。
在这里插入图片描述
资源链接 下载 ocilib-4.6.4-windows.zip
官网下载地址:https://github.com/vrogier/ocilib/releases/

// .cpp文件
#include "DataBase.h"

list <string>  productInformation_S;											// 从数据库中 读取的 数据



DataBase::DataBase()
	:m_nRet(0)
{


}

DataBase::~DataBase()
{


}

//--------------------------------------------------------------------------
//类及函数名:    DataBase::err_handler()
//返回值类型:    void
//函数参数    :    OCI_Error *err 错误类型
//函数说明    :    数据库操作过程错误处理
//--------------------------------------------------------------------------
void  DataBase::err_handler(OCI_Error *err)
{
    int   err_type = OCI_ErrorGetType(err);
    char *err_msg  = (char*)OCI_ErrorGetString(err);

    qDebug("%s - %s\n", err_type == OCI_ERR_WARNING ? "warning" : "error", err_msg);
    QMessageBox::about(NULL, "warning", "Content");
}

//--------------------------------------------------------------------------
//类及函数名:    
//返回值类型:    int类型 return 0;正常退出. return -1;OCI初始化失败. return -2;连接失败. return -3;建立声明失败.
//函数参数    :    无
//函数说明    :    数据库连接初始化
//--------------------------------------------------------------------------
int DataBase::DatabaseInit()
{
    //初始化OCI库
	m_nRet = OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT);
    if (!m_nRet)
    {
        qDebug("OCI_Initialize fail");
        return -1;
    }
    qDebug("compile version:%d\n", OCI_GetOCICompileVersion());
    qDebug("runtime version:%d\n", OCI_GetOCIRuntimeVersion());

    //连接 第一个参数格式:【IP:端口/服务名】,第二个参数:登录用户名,第三个参数:密码。
    m_cn = OCI_ConnectionCreate(PORTS, USERID, PASSWORD, OCI_SESSION_DEFAULT);
    if (NULL == m_cn)
    {
        qDebug("OCI_ConnectionCreate fail");
        err_handler(OCI_GetLastError());
        m_nRet = -2;
        return -2;
    }

    qDebug("Server major    version : %i\n", OCI_GetServerMajorVersion(m_cn));
    qDebug("Server minor    version : %i\n", OCI_GetServerMinorVersion(m_cn));
    qDebug("Server revision version : %i\n", OCI_GetServerRevisionVersion(m_cn));
    qDebug("Connection      version : %i\n", OCI_GetVersionConnection(m_cn));

    //建立声明
    m_st = OCI_StatementCreate(m_cn);
    if (NULL == m_st)
    {
        qDebug("OCI_StatementCreate fail");
        err_handler(OCI_GetLastError());
        m_nRet = -3;
        return -3;
    }

    return 0;
}

//--------------------------------------------------------------------------
//类及函数名:    DataBase::DatabaseSelect()
//返回值类型:    int类型 return -4;SQL准备出错. return -6;sql语句格式出错. return -5;返回集出错. return 0;正常执行
//函数参数    :    tableName :数据表名 . selectData:查询语句.   dataNumber: 查询结果每一行的个数
//函数说明    :    数据库查询语句执行
//--------------------------------------------------------------------------
int DataBase::DatabaseSelect(char * selectData , unsigned int dataNumber)
{

    //准备SQL语句
    if (!OCI_Prepare(m_st, selectData))
    {
        qDebug("OCI_Prepare fail");
        err_handler(OCI_GetLastError());
        m_nRet = -4;
        return -4;
    }

    //执行声明
    if (!OCI_Execute(m_st))
    {
        qDebug("OCI_Execute fail");
        err_handler(OCI_GetLastError());
        m_nRet = -6;
        return -6;
    }

    //得到返回值集
    m_rs = OCI_GetResultset(m_st);
    if (NULL == m_rs)
    {
        qDebug("OCI_GetResultset fail");
        err_handler(OCI_GetLastError());
        m_nRet = -5;
        return -5;
    }

    //枚举返回值集
    while (OCI_FetchNext(m_rs))
    {
        for (int i = 0; i < dataNumber; i++)
        {
            productInformation_S.push_back( OCI_GetString(m_rs, i + 1));
        }
    }
    return 0;
}


//--------------------------------------------------------------------------
//类及函数名:    DataBase::DatabaseExecStatement()
//返回值类型:    int类型 return -4;SQL准备出错. return -6;sql语句格式出错.  return 0;正常执行
//函数参数    :    execStatement 数据库语句
//函数说明    :    数据库执行语句,删除、修改、增加
//--------------------------------------------------------------------------
int  DataBase::DatabaseExecStatement(char * execStatement)
{
    //准备SQL语句
    if (!OCI_Prepare(m_st, execStatement))
    {
//        QMessageBox::about(NULL, QStringLiteral("提示"), QStringLiteral("语句出错"));
        err_handler(OCI_GetLastError());
        m_nRet = -4;
        return -4;
    }

    //执行声明
    if (!OCI_Execute(m_st))
    {
//        QMessageBox::about(NULL, QStringLiteral("提示"), QStringLiteral("语句执行失败"));
        err_handler(OCI_GetLastError());
        m_nRet = -6;
        return -6;
    }

    // 提交sql语句
    if (!OCI_Prepare(m_st, "commit"))            // 进行删除.更改等操作时最后须提交
    {
//        QMessageBox::about(NULL, QStringLiteral("提示"), QStringLiteral("commit提交语句出错"));
        err_handler(OCI_GetLastError());
        m_nRet = -4;
        return -4;
    }

    //执行声明
    if (!OCI_Execute(m_st))
    {
//        QMessageBox::about(NULL, QStringLiteral("提示"), QStringLiteral("提交失败"));
        err_handler(OCI_GetLastError());
        m_nRet = -6;
        return -6;
    }

    return 0;
}

//--------------------------------------------------------------------------
//类及函数名:    DataBase::DatabaseCleanup()
//返回值类型:    int类型 return 0;正常退出
//函数参数    :    无
//函数说明    :    数据库释放、清楚、断开连接
//--------------------------------------------------------------------------
int DataBase::DatabaseCleanup()
{
    // 清空数据链表中的数据
    productInformation_S.clear();

    //释放返回集
    if (m_rs)
        OCI_ReleaseResultsets(m_st);

    //清除声明
    if (m_st)
        OCI_StatementFree(m_st);

    //清除连接
    if (m_cn)
        OCI_ConnectionFree(m_cn);

    //清除OCI库
    OCI_Cleanup();
    m_cn = NULL;
    m_st = NULL;
    m_rs = NULL;
    return EXIT_SUCCESS;
}

//  .h 文件
//#include <windows.h>
#include <afxwin.h>							// 使用mfc函数库的时候需要注释掉 window.h 更换为 afxwin.h
#include <QMessageBox>
#include <stdio.h>
#include <stdlib.h>
#include <QDebug>
#include <iostream>
#include <list>
#include <string>
#include "ocilib.h"
#include <QTableWidget>
#include <QDateTime>


using namespace std;

#define  PORTS		"192.168.xxx.xx/AMINBIOT"
#define  USERID		"SYSTEM"
#define  PASSWORD	"这是密码"									账号密码连接名需要自己更换
extern list <string>  productInformation_S;											// 从数据库中 读取的 数据
class DataBase
{
public:
    DataBase();
    ~DataBase();
    void err_handler(OCI_Error *err);
    int     DatabaseInit();
    int  DatabaseSelect(char * selectData, unsigned int dataNumber);
    int  DatabaseExecStatement(char * execStatement);
    int  DatabaseCleanup();
private:
    OCI_Connection* m_cn = NULL;
    OCI_Statement * m_st = NULL;
    OCI_Resultset * m_rs = NULL;
    int        m_nRet;


};


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值