MFC开发操作Oracle一次成功的尝试(mfc访问oracle)

MFC开发操作Oracle:一次成功的尝试

随着数据库应用不断增多,对于开发人员来说,熟练掌握数据库的操作显得尤为重要。Oracle作为世界上最大的关系型数据库管理系统之一,其稳定性、高可用性和可扩展性等优势备受推崇。本文将介绍如何使用MFC开发操作Oracle数据库的程序。

一、环境准备

在进行MFC开发操作Oracle前,需要确保电脑上已经安装了Oracle客户端。Oracle客户端提供了所有必要的库和头文件,其中包括ODBC驱动程序、OCI库模块和SQL*Net支持等组件。下载地址:https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html

二、建立连接

在MFC程序中调用OCI库函数连接Oracle数据库是最基本的操作之一。需要在程序初始化时创建一个OCISvcCtx*型对象,并使用OCILogon()函数建立连接。以下是连接Oracle数据库的实例代码:

“` c++

OCISvcCtx* svchp;

OCIEnv* envhp;

OCIError* errhp;

OCIServer* srvhp;

OCIAuthInfo* authp = nullptr;

if (OCIEnvCreate(&envhp, OCI_THREADED, nullptr, nullptr, nullptr, nullptr, 0, nullptr) == OCI_SUCCESS)

{

if (OCIHandleAlloc(envhp, reinterpret_cast(&errhp), OCI_HTYPE_ERROR, 0, nullptr) == OCI_SUCCESS)

{

if (OCIHandleAlloc(envhp, reinterpret_cast(&srvhp), OCI_HTYPE_SERVER, 0, nullptr) == OCI_SUCCESS)

{

if (OCIServerAttach(srvhp, errhp, reinterpret_cast(ip), strlen(ip), OCI_DEFAULT) == OCI_SUCCESS)

{

if (OCIHandleAlloc(envhp, reinterpret_cast(&svchp), OCI_HTYPE_SVCCTX, 0, nullptr) == OCI_SUCCESS)

{

OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, srvhp, 0, OCI_ATTR_SERVER, errhp);

if (OCIHandleAlloc(envhp, reinterpret_cast(&authp), OCI_HTYPE_AUTHINFO, 0, nullptr) == OCI_SUCCESS)

{

OCISession* sesp = nullptr;

char dbNameChar[256] = {0};

sprintf_s(dbNameChar, “%s %s”, dbName, dbPassword);

if (OCIAQEnqStart(svchp, errhp, authp, dbNameChar, strlen(dbNameChar), OCI_DEFAULT) == OCI_SUCCESS)

{

if (OCIHandleAlloc(envhp, reinterpret_cast(&sesp), OCI_HTYPE_SESSION, 0, nullptr) == OCI_SUCCESS)

{

OCIAttrSet(svpch, OCI_HTYPE_SVCCTX, sesp, 0, OCI_ATTR_SESSION, errhp);

if (OCIAttrSet(authp, OCI_HTYPE_AUTHINFO, const_cast(dbUserName), strlen(dbUserName), OCI_ATTR_USERNAME, errhp) == OCI_SUCCESS)

{

if (OCIAttrSet(authp, OCI_HTYPE_AUTHINFO, const_cast(dbPassword), strlen(dbPassword), OCI_ATTR_PASSWORD, errhp) == OCI_SUCCESS)

{

if (OCISessionBegin(svchp, errhp, sesp, OCI_CRED_RDBMS, OCI_DEFAULT) == OCI_SUCCESS)

{

return svchp;

}

}

}

}

}

}

}

}

}

}

}


解释:先创建一个环境句柄envhp,然后用envhp创建出一个OCI错误句柄errhp。最后创建一个OCI服务器句柄srvhp。然后用srvhp连接数据库,并成功返回后才会用svcctx创建系统环境 OCISvcCtx,系统环境OCISvcCtx对整个应用程序是全局的,这样可以在整个应用程序中使用这个环境,数据处理句柄OCISvcCtx*只与数据库用户的认证相关,与所访问的联机数据库的数据完全 种类无关,即可访问别的数据库访问。

三、操作数据库

连接Oracle数据库成功后,操作数据库就变得十分简单,可以使用OCIStmtPrepare()函数将SQL语句转换为OCI语句。以下是查询数据库表的示例代码:

``` c++
OCIStmt* stmtselect;
if (OCIHandleAlloc(envhp, reinterpret_cast(&stmtselect), OCI_HTYPE_STMT, 0, nullptr) == OCI_SUCCESS)
{
char* select = nullptr;
sprintf_s(select, "select * from %s order by %s", tableName, tableColumn);
if (OCIStmtPrepare(stmtselect, errhp, const_cast(reinterpret_cast(select)), strlen(select), OCI_NTV_SYNTAX, OCI_DEFAULT) == OCI_SUCCESS)
{
if (OCIStmtExecute(svchp, stmtselect, errhp, MAX_FETCH_ROW_COUNT, 0, nullptr, nullptr, OCI_DEFAULT) == OCI_SUCCESS)
{
OCIParam* colcur;
if (OCIAttrGet(stmtselect,OCI_HTYPE_STMT,&colcur,0,OCI_ATTR_PARAM_COUNT,errhp)==OCI_SUCCESS)
{
for (int i = 1; i
{
OCIParam* colscp;
if (OCIParamGet(stmtselect, OCI_HTYPE_STMT, errhp, reinterpret_cast(&colscp), i) == OCI_SUCCESS)
{
OCIParam* copnm;
if (OCIAttrGet(colscp, OCI_DTYPE_PARAM, reinterpret_cast(&copnm), 0, OCI_ATTR_NAME, errhp) == OCI_SUCCESS)
{
fprintf(stdout, "%s\t", copnm);
}
}
}
fprintf(stdout, "\n");
OCIParam* colscp;
if (OCIParamGet(stmtselect, OCI_HTYPE_STMT, errhp, reinterpret_cast(&colscp), 1) == OCI_SUCCESS)
{
OCIDefine* defhp = nullptr;
char s[512] = { 0 };
sb4 slen;
OCIAttrGet(colscp, OCI_DTYPE_PARAM, &s, &slen, OCI_ATTR_NAME, errhp);
if (OCIDefineByPos(stmtselect, &defhp, errhp, 1, static_cast(&s[0]), strlen(s), SQLT_STR, static_cast(&slen), nullptr, nullptr, OCI_DEFAULT) == OCI_SUCCESS && OCIStmtFetch2(stmtselect, errhp, MAX_FETCH_ROW_COUNT, OCI_FETCH_NEXT, 0, OCI_DEFAULT) == OCI_SUCCESS && slen > 0)
{
fprintf(stdout, "%s\t", s);
}
}
}
}
}
}

解释:使用OCIStmtPrepare()函数将查询语句转换为OCI语句。然后用OCIStmtExecute()函数执行查询语句,将查询结果存储在stmtselect中。接下来,使用OCIAttrGet()函数获取查询结果的列数和每一列的名称,使用OCIDefineByPos()函数按行获取查询数据。使用OCIStmtFetch2()函数将数据取出并输出。

四、总结

本文介绍了使用MFC开发操作Oracle数据库的程序,首先需要安装Oracle客户端,并在程序初始化时建立连接。连接成功后,使用OCIStmtPrepare()函数将SQL语句转换为OCI语句,使用OCIStmtExecute()函数执行SQL语句,将查询结果存储在stmtselect中,并使用OCIDefineByPos()函数按行获取查询数据。本文提供的示例代码只是一个最基本的操作,读者可以根据实际情况进行改进和优化。


数据运维技术 » MFC开发操作Oracle一次成功的尝试(mfc访问oracle)