在现代编程中,与数据库的交互是不可或缺的一部分。Oracle数据库是广泛使用的企业级关系型数据库管理系统,据统计约有70%以上的中大型企业都在使用它。而C作为一种高效、面向过程的编程语言,也是数十年来一直被广泛运用。那么,如何利用C语言来与Oracle数据库进行读写呢?
首先,我们需要安装合适的Oracle驱动程序,比如OCI(Oracle Call Interface)。OCI是一种C编程接口,能够很好地操作Oracle数据库。在这里我以OCI为例,讲解C如何使用OCI来读写Oracle数据库。
// user.c
#include#include#includeint main(void)
{
OCIEnv *envhp;
OCIError *errhp;
OCISvcCtx *svchp;
OCISession *authp;
OCIDefine *defhp;
OCIStmt *stmthp;
sword status = 0;
text *username = "scott";
text *password = "tiger";
text *db = "localhost:1521/orcl";
text *sql = "SELECT * FROM emp";
/* 初始化环境变量 */
OCIInitialize(OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0 );
/* 分配环境变量 */
OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid *)0,
(dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t)) 0,
(void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **)0);
/*从环境变量中的到错误变量*/
OCIHandleAlloc((dvoid *) envhp, (dvoid **) &errhp,
OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0);
/*从环境变量中的到服务器上下文*/
OCIHandleAlloc((dvoid *) envhp, (dvoid **) &svchp,
OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0);
/*从环境变量中的到会话上下文*/
OCIHandleAlloc((dvoid *) envhp, (dvoid **) &authp,
OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0);
/*从会话上下文内得出语句句柄*/
OCIHandleAlloc((dvoid *) envhp, (dvoid **) &stmthp,
OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0);
/* 连接数据库 */
status = OCILogon(envhp, errhp, &svchp, username, (ub4)strlen(username),
password, (ub4)strlen(password), db, (ub4)strlen(db));
if (status == 0)
{
printf("Connect Success!\n");
/* 执行查询操作 */
OCIStmtPrepare(stmthp, errhp, sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT);
/* 定义结果集,这里只获取第一列 */
OCIDefineByPos(stmthp, &defhp, errhp, 1, (dvoid *)0, 0, SQLT_CHR, (dvoid *)0, 0, (dvoid *)0, OCI_DEFAULT);
/* 把结果集打印出来 */
printf("Query Result:\n");
while (OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_NEXT, (ub4)0, OCI_DEFAULT) == OCI_SUCCESS)
{
char buf[1024];
OCIDefineGetString(defhp, 0, buf, sizeof(buf), OCI_ATTR_DATA_LENGTH, &status);
printf("%s\n", buf);
}
}
else
{
printf("Connect Error!\n");
}
/* 释放资源 */
OCIHandleFree((dvoid*)stmthp, OCI_HTYPE_STMT);
OCIHandleFree((dvoid*)authp, OCI_HTYPE_SESSION);
OCIHandleFree((dvoid*)svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid*)errhp, OCI_HTYPE_ERROR);
OCITerminate(OCI_DEFAULT);
return 0;
}
这是一个简单的读取Oracle数据库的例子,我们使用OCILogon函数连接到数据库,然后使用OCIStmtPrepare函数来准备查询语句,再使用OCIStmtExecute函数来执行查询语句。接下来,我们使用OCIDefineByPos函数来定义结果集,再使用OCIStmtFetch2函数来获取查询结果,并使用OCIDefineGetString函数获取查询结果的每个元素。
在这个例子中,我们只使用了一个查询语句。如果我们想要执行其他更复杂的操作,比如插入、更新或删除,需要使用其他对应的函数来完成。比如OCIStmtExecute函数可以执行任何SQL语句,而不仅仅是SELECT语句。
此外,我们也可以使用OCI进行写操作。比如:
text *sql = "INSERT INTO emp (empno, ename) VALUES (9876,'Tom')";
OCIStmtPrepare(stmthp, errhp, sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT);
这样就可以在emp表中插入一条数据了。
总之,使用C语言读写Oracle数据库需要掌握OCI这一C编程接口,结合具体的实现语句,可以方便、高效地完成读写操作。同时,由于SQL语句的风格与C语言相似,对于C语言开发者来说上手难度不会太大。