C语言是一种非常流行的编程语言,在实际开发中,C语言可以轻松地利用它的强大功能进行各种编程操作。而在处理数据库操作时,C语言可以直接连接各种数据库,其中包括Oracle数据库。
在学习c语言连接Oracle数据库时,我们首先需要了解相应的工具和接口。C语言中,我们可以使用OCI(Oracle Call Interface)接口实现连接Oracle数据库。OCI依赖Oracle客户端库和头文件,因此在使用OCI时,我们需要在系统中安装Oracle客户端库并配置相关的环境变量。
#include#include#includeint main()
{
OCIEnv *envhp;
OCIError *errhp;
OCIServer *srvhp;
OCISession *sesnhp;
OCIInitialize(OCI_DEFAULT);
OCIHandleAlloc(envhp, &envhp, OCI_HTYPE_ENV, 0, NULL);
OCIHandleAlloc(envhp, &errhp, OCI_HTYPE_ERROR, 0, NULL);
OCIHandleAlloc(envhp, &srvhp, OCI_HTYPE_SERVER, 0, NULL);
OCIHandleAlloc(envhp, &sesnhp, OCI_HTYPE_SESSION, 0, NULL);
OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid *)"dbname", 6,
OCI_ATTR_SERVER, errhp);
OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, (dvoid *)"username", 8,
OCI_ATTR_USERNAME, errhp);
OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, (dvoid *)"password", 8,
OCI_ATTR_PASSWORD, errhp);
OCIServerAttach(srvhp, errhp, (text *)"", 0, OCI_DEFAULT);
OCISessionBegin(envhp, errhp, sesnhp, OCI_CRED_RDBMS, OCI_DEFAULT);
printf("Connection Successful");
return 0;
}
如上述代码,我们使用OCIHandleAlloc分配了环境控制、错误处理、服务器和会话等四个句柄,之后使用OCIAttrSet设置服务器和会话属性。最后通过OCIServerAttach和OCISessionBegin方法连接数据库,并输出连接成功的信息。
在实际开发中,我们通常会使用数据访问对象(DAO)实现对数据库的访问。DAO是一种常见的设计模式,它将数据访问从业务逻辑中分离出来,简化应用程序的开发和维护。我们可以在DAO中封装OCI接口,使得在业务中可以直接使用DAO实现对数据库的增删改查操作。
#include#include#include#include#include#define ORACLEDB "dbname"
#define USERNAME "username"
#define PASSWORD "password"
typedef struct _db_conn {
OCIEnv *envhp;
OCIError *errhp;
OCIServer *srvhp;
OCISession *sesnhp;
} db_conn;
void dao_init(db_conn *conn)
{
OCIInitialize(OCI_DEFAULT);
OCIHandleAlloc(conn->envhp, &conn->envhp, OCI_HTYPE_ENV, 0, NULL);
OCIHandleAlloc(conn->envhp, &conn->errhp, OCI_HTYPE_ERROR, 0, NULL);
OCIHandleAlloc(conn->envhp, &conn->srvhp, OCI_HTYPE_SERVER, 0, NULL);
OCIHandleAlloc(conn->envhp, &conn->sesnhp, OCI_HTYPE_SESSION, 0, NULL);
OCIAttrSet(conn->srvhp, OCI_HTYPE_SERVER, (dvoid *)ORACLEDB, strlen(ORACLEDB),
OCI_ATTR_SERVER, conn->errhp);
OCIAttrSet(conn->sesnhp, OCI_HTYPE_SESSION, (dvoid *)USERNAME, strlen(USERNAME),
OCI_ATTR_USERNAME, conn->errhp);
OCIAttrSet(conn->sesnhp, OCI_HTYPE_SESSION, (dvoid *)PASSWORD, strlen(PASSWORD),
OCI_ATTR_PASSWORD, conn->errhp);
OCIServerAttach(conn->srvhp, conn->errhp, (text *)"", 0, OCI_DEFAULT);
OCISessionBegin(conn->envhp, conn->errhp, conn->sesnhp, OCI_CRED_RDBMS, OCI_DEFAULT);
OCIAttrSet(conn->sesnhp, OCI_HTYPE_SESSION, conn->srvhp, 0, OCI_ATTR_SERVER, conn->errhp);
}
void dao_end(db_conn *conn)
{
OCISessionEnd(conn->envhp, conn->errhp, conn->sesnhp, OCI_DEFAULT);
OCIServerDetach(conn->srvhp, conn->errhp, OCI_DEFAULT);
OCIHandleFree(conn->envhp, OCI_HTYPE_ENV);
}
int dao_execute(db_conn *conn, const char *sql, ...)
{
OCIStmt *stmthp;
va_list ap;
int count = 0;
int rc;
va_start(ap, sql);
OCIHandleAlloc(conn->envhp, &stmthp, OCI_HTYPE_STMT, 0, 0);
OCIStmtPrepare(stmthp, conn->errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
count = OCIStmtBind(stmthp, conn->errhp, ap);
rc = OCIStmtExecute(conn->sesnhp, stmthp, conn->errhp, 0, 0, NULL, NULL, OCI_DEFAULT);
va_end(ap);
OCIHandleFree(stmthp, OCI_HTYPE_STMT);
return rc;
}
如上述代码,我们定义了一个db_conn结构体,其中包含了OCI环境控制、错误处理、服务器和会话等四个句柄,通过dao_init初始化OCI环境,dao_end结束OCI环境,dao_execute实现数据操作等一系列操作。
总之,C语言在连接Oracle数据库方面有着很多的优势,不仅提供了丰富的接口,而且可以在C语言开发的各种应用程序中,轻松地调用和使用相关的数据库操作,为我们的开发和实际应用带来了很多的便利。