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

c 连oracle数据库

C语言连接Oracle数据库通常使用OCI(Oracle Call Interface)库。

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

1、使用OCI(Oracle Call Interface)

安装和配置OCI:在使用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;
         OCIEnvCreate(&env, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
         OCIHandleAlloc(env, (void *)&err, OCI_HTYPE_ERROR, 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),在Linux系统中,可以使用以下命令来安装和配置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环境,在Linux系统中,可以使用以下命令来设置环境变量:

export ORACLE_HOME=/path/to/oracle/client

export PATH=$ORACLE_HOME/bin:$PATH

**编写Pro*C程序**:可以直接嵌入SQL语句。

      #include <stdio.h>
      #include <stdlib.h>
      #include <sqlca.h>
      EXEC SQL INCLUDE SQLCA;
      int main() {
          EXEC SQL BEGIN DECLARE SECTION;
          VARCHAR usr[20], pass[20], serv[20];
          char emp_name[20];
          int emp_id;
          EXEC SQL END DECLARE SECTION;
          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 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;
      }

然后使用Pro*C预编译器对代码进行编译,生成可执行文件。

proc test.pc(生成test.c文件)

gcc -o test test.c -lclntsh(生成可执行文件)

以下是两个常见问题及解答:

1、问题:使用OCI连接Oracle数据库时,出现“ORA-ERROR: sqlca.sqlcode = 100”错误,是什么原因?

解答:这个错误通常表示无法连接到数据库,可能的原因包括数据库服务未启动、用户名或密码错误、网络连接问题等,可以检查数据库服务状态、确认用户名和密码是否正确、检查网络连接是否正常等。

2、问题:通过ODBC连接Oracle数据库时,如何指定连接的端口号?

解答:在配置数据源名称(DSN)时,可以在DSN字符串中添加“PORT=端口号”参数来指定连接的端口号。“DSN=mydsn;UID=username;PWD=password;PORT=1521;”。

小编有话说:C语言连接Oracle数据库有多种方法可供选择,每种方法都有其特点和适用场景,在实际开发中,需要根据具体的需求和项目情况选择合适的连接方式,要注意正确安装和配置相关软件、库和环境变量,以确保连接的成功和稳定,在编写代码时,要仔细处理错误和异常情况,保证程序的健壮性和可靠性,希望以上内容能对您有所帮助,祝您在C语言连接Oracle数据库的开发过程中顺利!