在C语言中连接Oracle数据库,可以使用OCI(Oracle Call Interface)、ODBC(Open Database Connectivity)接口或Pro*C预编译器,以下将详细介绍这三种方法的具体步骤和使用示例:
1、OCI
安装和配置OCI:在使用OCI之前,需要安装Oracle客户端并配置环境变量,如ORACLE_HOME和LD_LIBRARY_PATH。
编写OCI程序:初始化OCI环境、分配和初始化OCI句柄、建立数据库连接、执行SQL语句和释放资源。
OCIEnv *env; OCIError *err; OCIEnvCreate(&env, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL); OCIHandleAlloc(env, (void)&err, OCI_HTYPE_ERROR, 0, NULL); OCIHandleAlloc(env, (void)&svc, OCI_HTYPE_SVCCTX, 0, NULL); OCILogon(env, err, &svc, "username", strlen("username"), "password", strlen("password"), "dbname", strlen("dbname")); // 执行SQL语句 OCIStmt *stmt; OCIHandleAlloc(env, (void)&stmt, OCI_HTYPE_STMT, 0, NULL); OCIStmtPrepare(stmt, err, "SELECT * FROM mytable", strlen("SELECT * FROM mytable"), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(svc, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT); // 处理结果集 OCIDefine *defn; char result[100]; OCIHandleAlloc(env, (void)&defn, OCI_HTYPE_DEFINE, 0, NULL); OCIDefineByPos(stmt, &defn, err, 1, (void*)result, 100, SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT); while (OCIStmtFetch(stmt, err, 1, OCI_FETCH_NEXT, OCI_DEFAULT) == OCI_SUCCESS) { printf("Result: %s ", result); } // 清理资源 OCIHandleFree(stmt, OCI_HTYPE_STMT); OCILogoff(svc, err); OCIHandleFree(svc, OCI_HTYPE_SVCCTX); OCIHandleFree(err, OCI_HTYPE_ERROR); OCIHandleFree(env, OCI_HTYPE_ENV);
优点:OCI是Oracle提供的原生API,具有较高的性能和灵活性。
缺点:需要详细了解其API和使用方法,相对复杂。
2、ODBC
安装和配置ODBC:需要安装ODBC驱动程序,并配置数据源名称(DSN)。
编写ODBC程序:初始化ODBC环境、分配和初始化ODBC句柄、建立数据库连接、执行SQL语句和释放资源。
SQLHENV env; SQLHDBC dbc; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); SQLCHAR dsn[] = "DSN=mydsn;UID=username;PWD=password;"; SQLDriverConnect(dbc, NULL, dsn, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); SQLHSTMT stmt; SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); SQLExecDirect(stmt, (SQLCHAR*)"SELECT * FROM mytable", SQL_NTS); // 处理结果集 SQLCHAR result[100]; SQLBindCol(stmt, 1, SQL_C_CHAR, result, sizeof(result), NULL); while (SQLFetch(stmt) == SQL_SUCCESS) { printf("Result: %s ", result); } // 清理资源 SQLFreeHandle(SQL_HANDLE_STMT, stmt); SQLDisconnect(dbc); SQLFreeHandle(SQL_HANDLE_DBC, dbc); SQLFreeHandle(SQL_HANDLE_ENV, env);
优点:ODBC是一个通用的数据库连接接口,支持多种数据库,便于移植。
缺点:性能可能不如OCI高。
3、**Pro*C预编译器
**安装和配置Pro*C**:需要安装Oracle客户端,并配置Pro*C环境。
**编写Pro*C程序**:嵌入SQL语句。
#include <stdio.h> #include <stdlib.h> #include <sqlca.h> EXEC SQL INCLUDE SQLCA; int main() { char emp_name[20]; int emp_id; EXEC SQL BEGIN DECLARE SECTION; VARCHAR usr[20], pass[20], serv[20]; strcpy(usr.arr,"test01"); usr.len=(unsigned short)strlen((char *)usr.arr); strcpy(pass.arr,"111111"); pass.len=(unsigned short)strlen((char *)pass.arr); strcpy(serv.arr,"orcl"); serv.len=(unsigned short)strlen((char *)serv.arr); EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT :usr IDENTIFIED BY :pass USING :serv; if(sqlca.sqlcode) { printf("ORA-ERROR: sqlca.sqlcode=%d ",sqlca.sqlcode); exit(0); } printf("Connect! "); printf("please input id:"); scanf("%d",&emp_id); EXEC SQL SELECT emp_id , emp_name into :emp_id,:emp_name from emp where emp_id=:emp_id; printf("Name=%s ", emp_name); EXEC SQL COMMIT WORK RELEASE; printf("Disconnect! "); return 0; }
优点:适合需要嵌入SQL的应用程序。
缺点:需要额外的学习和配置。
FAQs:
Q1: 如何在C语言中使用OCI连接到Oracle数据库?
A1: 首先安装Oracle客户端并配置环境变量,然后编写OCI程序,包括初始化OCI环境、分配和初始化OCI句柄、建立数据库连接、执行SQL语句和释放资源,具体代码示例如下:
OCIEnv *env; OCIError *err; OCIEnvCreate(&env, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL); OCIHandleAlloc(env, (void)&err, OCI_HTYPE_ERROR, 0, NULL); OCIHandleAlloc(env, (void)&svc, OCI_HTYPE_SVCCTX, 0, NULL); OCILogon(env, err, &svc, "username", strlen("username"), "password", strlen("password"), "dbname", strlen("dbname")); // 执行SQL语句 OCIStmt *stmt; OCIHandleAlloc(env, (void)&stmt, OCI_HTYPE_STMT, 0, NULL); OCIStmtPrepare(stmt, err, "SELECT * FROM mytable", strlen("SELECT * FROM mytable"), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(svc, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT); // 处理结果集 OCIDefine *defn; char result[100]; OCIHandleAlloc(env, (void)&defn, OCI_HTYPE_DEFINE, 0, NULL); OCIDefineByPos(stmt, &defn, err, 1, (void*)result, 100, SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT); while (OCIStmtFetch(stmt, err, 1, OCI_FETCH_NEXT, OCI_DEFAULT) == OCI_SUCCESS) { printf("Result: %s ", result); } // 清理资源 OCIHandleFree(stmt, OCI_HTYPE_STMT); OCILogoff(svc, err); OCIHandleFree(svc, OCI_HTYPE_SVCCTX); OCIHandleFree(err, OCI_HTYPE_ERROR); OCIHandleFree(env, OCI_HTYPE_ENV);
Q2: 如何在C语言中使用ODBC连接到Oracle数据库?
A2: 首先安装ODBC驱动程序并配置数据源名称(DSN),然后编写ODBC程序,包括初始化ODBC环境、分配和初始化ODBC句柄、建立数据库连接、执行SQL语句和释放资源,具体代码示例如下:
SQLHENV env; SQLHDBC dbc; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); SQLCHAR dsn[] = "DSN=mydsn;UID=username;PWD=password;"; SQLDriverConnect(dbc, NULL, dsn, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); SQLHSTMT stmt; SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); SQLExecDirect(stmt, (SQLCHAR*)"SELECT * FROM mytable", SQL_NTS); // 处理结果集 SQLCHAR result[100]; SQLBindCol(stmt, 1, SQL_C_CHAR, result, sizeof(result), NULL); while (SQLFetch(stmt) == SQL_SUCCESS) { printf("Result: %s ", result); } // 清理资源 SQLFreeHandle(SQL_HANDLE_STMT, stmt); SQLDisconnect(dbc); SQLFreeHandle(SQL_HANDLE_DBC, dbc); SQLFreeHandle(SQL_HANDLE_ENV, env);
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1484219.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复