在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数据库类”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!