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

c 中连接oracle数据库

在C语言中连接Oracle数据库,通常需要使用Oracle提供的OCI(Oracle Call Interface)库。需要包含必要的头文件并链接相应的库。初始化OCI环境,设置连接属性,创建连接句柄,最后通过用户名、密码和数据库服务名建立连接。

在C语言中连接Oracle数据库,主要有以下几种方法:

1、使用OCI(Oracle Call Interface)

安装和配置OCI:首先需要安装Oracle客户端并配置环境变量,在Linux系统中,可以使用以下命令来设置环境变量:

      export ORACLE_HOME=/path/to/oracle/client
      export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH

编写OCI程序

初始化OCI环境:在进行数据库操作之前,需要初始化OCI环境,示例代码如下:

        OCIEnv *env;
        OCIError *err;
        OCIHandleAlloc(env, (void)&err, OCI_HTYPE_ERROR, 0, NULL);
        OCIEnvCreate(&env, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);

连接数据库:使用OCI进行数据库连接,示例代码如下:

        OCISvcCtx *svc;
        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);

2、通过ODBC(Open Database Connectivity)接口

安装和配置ODBC:需要安装ODBC驱动程序,并配置数据源名称(DSN),可以使用以下命令来安装和配置ODBC:

      odbcinst -i -d -f /path/to/odbcinst.ini
      odbcinst -i -s -l -f /path/to/odbc.ini

编写ODBC程序

初始化ODBC环境:示例代码如下:

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

执行SQL语句:示例代码如下:

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

3、**利用Pro*C预编译器

**安装和配置Pro*C**:需要安装Oracle客户端,并配置Pro*C环境,示例代码如下:

      export ORACLE_HOME=/path/to/oracle/client
      export PATH=$ORACLE_HOME/bin:$PATH

**编写Pro*C程序**:在Pro*C程序中,可以直接嵌入SQL语句,示例代码如下:

      #include <stdio.h>
      #include <stdlib.h>
      #include <sqlca.h>
      EXEC SQL INCLUDE SQLCA;
      int main() {
          EXEC SQL BEGIN DECLARE SECTION;
          VARCHAR user[20], pass[20], tnsname[20];
          char ename[20];
          int empno;
          EXEC SQL END DECLARE SECTION;
          strcpy(user.arr,"umail");
          user.len=(unsigned short)strlen((char *)user.arr);
          strcpy(pass.arr,"umail");
          pass.len=(unsigned short)strlen((char *)pass.arr);
          strcpy(tnsname.arr,"umail");
          tnsname.len=(unsigned short)strlen((char *)tnsname.arr);
          EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :tnsname;
          EXEC SQL declare emp_cursor cursor for select id, ename from umail.tt1;
          EXEC SQL open emp_cursor;
          EXEC SQL WHENEVER NOT FOUND DO break;
          while(1) {
              EXEC SQL fetch emp_cursor into :empno, :ename;
              printf("the empno %d's name is %s
", empno, ename);
          }
          printf("Yeah! We get %d records
", i);
          EXEC SQL close emp_cursor;
          EXEC SQL commit work release;
          return 0;
      }

FAQs

1、如何在C语言中使用OCI连接Oracle数据库?

答:在C语言中使用OCI连接Oracle数据库的步骤包括安装和配置OCI、初始化OCI环境、连接数据库、执行SQL语句、处理结果集以及清理资源,具体代码示例可以参考上述内容中的OCI部分。

2、如何在C语言中使用ODBC连接Oracle数据库?

答:在C语言中使用ODBC连接Oracle数据库的步骤包括安装和配置ODBC、初始化ODBC环境、连接数据库、执行SQL语句、处理结果集以及清理资源,具体代码示例可以参考上述内容中的ODBC部分。

3、如何在C语言中使用Pro*C预编译器连接Oracle数据库?

答:在C语言中使用Pro*C预编译器连接Oracle数据库的步骤包括安装和配置Pro*C、编写Pro*C程序以及编译和运行程序,具体代码示例可以参考上述内容中的Pro*C部分。

0