在C语言中连接Oracle数据库,可以通过多种方式实现,下面将详细介绍如何使用OCI(Oracle Call Interface)和ODBC(Open Database Connectivity)这两种常用的方法来连接Oracle数据库,并提供相应的代码示例。


OCI(Oracle Call Interface)
OCI是Oracle提供的原生API,允许应用程序与Oracle数据库进行高效的通信,以下是使用OCI连接Oracle数据库的步骤和代码示例:
1. 安装和配置OCI
在使用OCI之前,首先需要安装Oracle客户端并配置环境变量,如ORACLE_HOME和LD_LIBRARY_PATH。
export ORACLE_HOME=/path/to/oracle/client export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
2. 编写OCI程序
初始化OCI环境、连接数据库、执行SQL语句、处理结果集以及清理资源是使用OCI的基本步骤。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>
int main() {
OCIEnv *envhp;
OCIError *errhp;
OCISvcCtx *svchp;
OCIStmt *sthp;
sword status;
// 初始化OCI环境
status = OCIEnvCreate(&envhp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
if (status != OCI_SUCCESS) {
fprintf(stderr, "OCIEnvCreate failed
");
return EXIT_FAILURE;
}
// 创建错误句柄
status = OCIHandleAlloc(envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, 0, NULL);
if (status != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleAlloc for error handle failed
");
OCIEnvFree(envhp, OCI_DEFAULT);
return EXIT_FAILURE;
}
// 创建服务句柄并连接到数据库
status = OCIHandleAlloc(envhp, (dvoid **)&svchp, OCI_HTYPE_SVCCTX, 0, NULL);
if (status != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleAlloc for service context failed
");
OCIHandleFree((dvoid *)errhp, OCI_HTYPE_ERROR);
OCIEnvFree(envhp, OCI_DEFAULT);
return EXIT_FAILURE;
}
status = OCILogon(envhp, errhp, &svchp, "username", strlen("username"), "password", strlen("password"), "dbname", strlen("dbname"));
if (status != OCI_SUCCESS) {
fprintf(stderr, "OCILogon failed
");
OCIHandleFree((dvoid *)svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid *)errhp, OCI_HTYPE_ERROR);
OCIEnvFree(envhp, OCI_DEFAULT);
return EXIT_FAILURE;
}
printf("Connected to Oracle Database successfully!
");
// 创建语句句柄并执行SQL查询
status = OCIHandleAlloc(svchp, (dvoid **)&sthp, OCI_HTYPE_STMT, 0, NULL);
if (status != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleAlloc for statement handle failed
");
OCILogoff(svchp, errhp);
OCIHandleFree((dvoid *)svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid *)errhp, OCI_HTYPE_ERROR);
OCIEnvFree(envhp, OCI_DEFAULT);
return EXIT_FAILURE;
}
char *sql = "SELECT * FROM mytable";
status = OCIStmtPrepare(sthp, errhp, (const text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
if (status != OCI_SUCCESS) {
fprintf(stderr, "OCIStmtPrepare failed
");
OCIHandleFree((dvoid *)sthp, OCI_HTYPE_STMT);
OCILogoff(svchp, errhp);
OCIHandleFree((dvoid *)svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid *)errhp, OCI_HTYPE_ERROR);
OCIEnvFree(envhp, OCI_DEFAULT);
return EXIT_FAILURE;
}
status = OCIStmtExecute(svchp, sthp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
if (status != OCI_SUCCESS) {
fprintf(stderr, "OCIStmtExecute failed
");
OCIHandleFree((dvoid *)sthp, OCI_HTYPE_STMT);
OCILogoff(svchp, errhp);
OCIHandleFree((dvoid *)svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid *)errhp, OCI_HTYPE_ERROR);
OCIEnvFree(envhp, OCI_DEFAULT);
return EXIT_FAILURE;
}
// 处理结果集(此处省略具体处理逻辑)
// ...
// 清理资源
OCIHandleFree((dvoid *)sthp, OCI_HTYPE_STMT);
OCILogoff(svchp, errhp);
OCIHandleFree((dvoid *)svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid *)errhp, OCI_HTYPE_ERROR);
OCIEnvFree(envhp, OCI_DEFAULT);
return EXIT_SUCCESS;
}ODBC(Open Database Connectivity)
ODBC是一个通用的数据库连接接口,支持多种数据库,包括Oracle,以下是使用ODBC连接Oracle数据库的步骤和代码示例:

1. 安装和配置ODBC
需要安装ODBC驱动程序,并配置数据源名称(DSN)。
odbcinst -i -d -f /path/to/odbcinst.ini odbcinst -i -s -l -f /path/to/odbc.ini
2. 编写ODBC程序
初始化ODBC环境、连接数据库、执行SQL语句、处理结果集以及清理资源是使用ODBC的基本步骤。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sql.h>
#include <sqlext.h>
void checkError(SQLRETURN ret, SQLHANDLE h, SQLSMALLINT type) {
if (!SQL_SUCCEEDED && !SQL_NO_DATA) {
SQLCHAR sqlstate[6], msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER native;
SQLSMALLINT length;
switch (type) {
case SQL_HANDLE_ENV:
printf("Environment handle error
");
break;
case SQL_HANDLE_DBC:
printf("Connection handle error
");
break;
case SQL_HANDLE_STMT:
printf("Statement handle error
");
break;
default:
break;
}
SQLGetDiagRec(h, type, 1, sqlstate, &native, msg, sizeof(msg), &length);
printf("Message: %s
", msg);
exit(1);
}
}
int main() {
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret; /* ODBC API return status */
SQLCHAR dsn[] = "DSN=mydsn;UID=username;PWD=password;"; /* data source name=mydsn */
char result[100];
SQLINTEGER empno;
char ename[50];
char job[30];
float sal;
char dept[20];
char mgr[20];
char hiredate[12];
char sql[256]; /* SQL statement */
char empid[10]; /* employee id */
int empidlen; /* length of the id string */
char empname[50]; /* employee name */
int empnamelen; /* length of the name string */
char empjob[30]; /* job title */
int empjoblen; /* length of the job title string */
float empsal; /* salary */
char empdept[20]; /* department */
int empdeptlen; /* length of the department string */
char empmgr[20]; /* manager id */
int empmgrlen; /* length of the manager id string */
char emphiredate[12]; /* hire date */
int emphiredatelen; /* length of the hire date string */
char empcomm[10]; /* commission */
int empcommlen; /* length of the commission string */
char empbonus[10]; /* bonus */
int empbonuslen; /* length of the bonus string */
char empgrade[10]; /* grade level */
int empgradelen; /* length of the grade level string */
char empnext[10]; /* next raise date */
int empnextlen; /* length of the next raise date string */
char empproj[30]; /* project code */
int empprojlen; /* length of the project code string */
char empmng[30]; /* manager name */
int empmnglen; /* length of the manager name string */
char empnotes[256]; /* notes */
int empnoteslen; /* length of the notes string */
char empphoto[2048]; /* photograph */
int empphotolen; /* length of the photograph string */
char empaudio[1024]; /* audio file */
int empaudiolen; /* length of the audio file string */
char empvideo[2048]; /* video file */
int empvideolen; /* length of the video file string */
/* initialize environment and connect to database */
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); /* Allocate environment handle */
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, 6); /* We want ODBC version 3 */
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); /* Allocate connection handle */
ret = SQLDriverConnect(dbc, NULL, dsn, SQL_NTS, NULL, 0, NULL, 0, &sqlstate); /* Connect to data source */
checkError(ret, dbc, SQL_HANDLE_DBC); /* Check for success or failure */
printf("Connected to Oracle Database successfully!
");
/* create a statement handle */
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); /* Allocate statement handle */
strcpy(sql, "SELECT * FROM mytable"); /* Create SQL query */
ret = SQLExecDirect(stmt, (SQLCHAR *)sql, SQL_NTS); /* Execute SQL query */
checkError(ret, stmt, SQL_HANDLE_STMT); /* Check for success or failure */
/* bind columns in result set to variables */
SQLBindCol(stmt, 1, SQL_C_CHAR, result, sizeof(result), NULL); /* Bind column 1 to variable 'result' */
while (SQLFetch(stmt) == SQL_SUCCESS) { /* fetch each row */
printf("Result: %s
", result); /* Print the result */
}
/* disconnect from database and free resources */
SQLDisconnect(dbc); /* Disconnect from database */
SQLFreeHandle(SQL_HANDLE_STMT, stmt); /* Free statement handle */
SQLFreeHandle(SQL_HANDLE_DBC, dbc); /* Free connection handle */
SQLFreeHandle(SQL_HANDLE_ENV, env); /* Free environment handle */
return 0; /* Return success */
}相关问题与解答栏目:
**问题1:如何在C语言中使用Pro*C预编译器连接Oracle数据库?
答案1: Pro*C是一种预编译器,可以将嵌入在C代码中的SQL语句转换为OCI调用,使用Pro*C连接Oracle数据库的步骤如下:首先安装Oracle客户端并配置Pro*C环境;然后在Pro*C程序中嵌入SQL语句,并通过预编译生成C代码;最后编译并运行该C代码即可,具体代码示例可参考Pro*C官方文档或相关教程。
以上就是关于“c连接oracle数据库类”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/5621.html<
