C 语言配置 Oracle 数据库连接
在进行 C 语言开发过程中,经常需要与数据库进行交互,而 Oracle 数据库是广泛应用的一种数据库管理系统。本文将介绍在 C 语言开发中如何配置 Oracle 数据库连接。
1. 下载 Oracle Instant Client
Oracle Instant Client 是 Oracle 公司提供的一个小型的客户端程序包,以便在没有完整 Oracle 客户端安装的情况下进行访问 Oracle 数据库。我们可以从官方网站(https://www.oracle.com/database/technologies/instant-client/downloads.html)下载适用于自己的操作系统的版本。
2. 配置环境变量
下载完 Oracle Instant Client 后,需要将其添加到环境变量中。以 Windows 操作系统为例,可以将 Instant Client 文件夹(例如:C:\instantclient_19_11)添加到系统环境变量的 PATH 中。
在 Linux 操作系统中,可以将 Instant Client 文件夹路径添加到 /etc/profile 中,然后运行 source /etc/profile 或重新启动系统。
3. 配置头文件和库文件
在 C 语言中要使用 Oracle 连接,需要引用相应的头文件和库文件。在 Oracle Instant Client 下载的文件夹中,可以找到头文件和库文件的路径。其中,头文件包括 oci.h 和 ociextp.h,库文件包括 libclntsh.so 和 libocci.so(在 Windows 中对应其它文件名)。
在编译 C 语言程序时,需要将这些文件路径传递给编译器。例如,在 Linux 中可以使用以下命令:
gcc -o test test.c -I /usr/include/oracle/xx.x/client64 -L /usr/lib/oracle/xx.x/client64 -lclntsh -locci
其中,xx.x 是 Oracle Instant Client 的版本号。
4. 编写连接代码
一旦在 C 语言开发环境中配置了 Oracle 连接所需的文件和路径,就可以开始编写连接代码了。以下是一个连接 Oracle 数据库并执行简单查询的示例代码:
#include
#include
#include
#define USERNAME “your_username”
#define PASSWORD “your_password”
#define DATABASE “your_database”
#define QUERY “SELECT * FROM emp”
int mn() {
OCIEnv *envhp;
OCIError *errhp;
OCISvcCtx *svchp;
OCIStmt *stmthp;
OCIDefine *defnp;
OCIBind *bndhp;
OCIParam *parmp;
sword status;
ub4 rowcnt = 0;
int empno;
char ename[30];
int sal;
status = OCIEnvCreate(&envhp, OCI_THREADED | OCI_OBJECT, 0, 0, 0, 0, 0, 0);
if (status != OCI_SUCCESS) {
printf(“OCIEnvCreate fled\n”);
return 1;
}
status = OCIHandleAlloc(envhp, (void**)&errhp, OCI_HTYPE_ERROR, 0, 0);
if (status != OCI_SUCCESS) {
printf(“OCIHandleAlloc fled\n”);
return 2;
}
status = OCIHandleAlloc(envhp, (void**)&svchp, OCI_HTYPE_SVCCTX, 0, 0);
if (status != OCI_SUCCESS) {
printf(“OCIHandleAlloc fled\n”);
return 3;
}
status = OCIHandleAlloc(envhp, (void**)&stmthp, OCI_HTYPE_STMT, 0, 0);
if (status != OCI_SUCCESS) {
printf(“OCIHandleAlloc fled\n”);
return 4;
}
status = OCILogon(envhp, errhp, &svchp, (const OraText*)USERNAME, strlen(USERNAME), (const OraText*)PASSWORD, strlen(PASSWORD), (const OraText*)DATABASE, strlen(DATABASE));
if (status != OCI_SUCCESS) {
printf(“OCILogon fled\n”);
return 5;
}
status = OCIHandleAlloc(envhp, (void**)&bndhp, OCI_HTYPE_BIND, 0, 0);
if (status != OCI_SUCCESS) {
printf(“OCIHandleAlloc fled\n”);
return 6;
}
status = OCIStmtPrepare(stmthp, errhp, (const OraText*)QUERY, strlen(QUERY), OCI_NTV_SYNTAX, OCI_DEFAULT);
if (status != OCI_SUCCESS) {
printf(“OCIStmtPrepare fled\n”);
return 7;
}
status = OCIDefineByPos(stmthp, &defnp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, OCI_DEFAULT);
if (status != OCI_SUCCESS) {
printf(“OCIDefineByPos fled\n”);
return 8;
}
status = OCIDefineByPos(stmthp, &defnp, errhp, 2, ename, sizeof(ename), SQLT_STR, 0, 0, 0, OCI_DEFAULT);
if (status != OCI_SUCCESS) {
printf(“OCIDefineByPos fled\n”);
return 9;
}
status = OCIDefineByPos(stmthp, &defnp, errhp, 3, &sal, sizeof(sal), SQLT_INT, 0, 0, 0, OCI_DEFAULT);
if (status != OCI_SUCCESS) {
printf(“OCIDefineByPos fled\n”);
return 10;
}
status = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT);
if (status != OCI_SUCCESS) {
printf(“OCIStmtExecute fled\n”);
return 11;
}
while ((status = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) != OCI_NO_DATA) {
if (status != OCI_SUCCESS) {
printf(“OCIStmtFetch fled\n”);
return 12;
}
rowcnt++;
printf(“Emp No: %d, Name: %s, Salary: %d\n”, empno, ename, sal);
}
printf(“Total row count = %d\n”, rowcnt);
OCIStmtRelease(stmthp, errhp, NULL, 0, NULL);
OCISessionEnd(svchp, errhp, NULL, 0);
OCIServerDetach(svchp, errhp, OCI_DEFAULT);
OCIHandleFree(stmthp, OCI_HTYPE_STMT);
OCIHandleFree(svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
OCIHandleFree(envhp, OCI_HTYPE_ENV);
return 0;
}
在以上代码中,我们使用 OCIEnvCreate 创建了一个运行时环境,使用 OCILogon 连接到 Oracle 数据库并预编译查询语句。然后我们使用 OCIDefineByPos 定义结果集,并使用 OCIStmtExecute 执行查询。最后我们使用 OCIStmtFetch 循环获取所有查询结果。
以上是使用 C 语言连接 Oracle 数据库的步骤,希望对您有所帮助。