当前位置:首页 > 行业动态 > 正文

如何创建用于连接Oracle数据库的C类?

要连接Oracle数据库,首先需要添加依赖库,然后使用 DriverManager.getConnection()方法建立 连接。

在C语言中连接Oracle数据库,可以使用OCI(Oracle Call Interface)、ODBC(Open Database Connectivity)接口或Pro*C预编译器,以下将详细介绍这三种方法的具体步骤和使用示例:

如何创建用于连接Oracle数据库的C类?  第1张

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);
0