(*****特别声明-以下方式只能在单线程中使用,多线程中由于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;
};