当前位置:首页 > 数据库 > 正文

c语言怎么连接oracle数据库

C语言中连接Oracle数据库,通常需要使用Oracle提供的OCI(Oracle Call Interface)库,确保已安装Oracle客户端和OCI开发库,在代码中包含必要的头文件,如 oci.h,并链接相应的库文件,通过调用OCI函数进行数据库连接、执行SQL语句和处理结果集。

以下是使用C语言连接Oracle数据库的详细步骤:

安装相关软件

  1. 安装Oracle数据库:从Oracle官网下载适合操作系统版本的Oracle数据库安装包,如Oracle Database Express Edition(适用于Windows和Linux平台),按照安装向导逐步完成安装,安装完成后,确保数据库实例正在运行,并记录实例名称、主机地址、端口号等连接信息。

  2. 安装Oracle Instant Client

    • Windows系统:前往Oracle官方网站下载对应版本的Instant Client安装文件,如instantclient-basic-windows.x64-版本号.zip,解压压缩包到指定目录,如D:oracleinstantclient_19_8,然后配置环境变量,在系统环境变量中添加“ORACLE_HOME”变量,值为Instant Client的安装目录;将“;D:oracleinstantclient_19_8”添加到“PATH”变量中。
    • Linux系统:使用包管理工具安装,如在Ubuntu系统中,可执行以下命令:
      sudo apt get update
      sudo apt get install libaio1
      sudo mkdir /opt/oracle
      cd /opt/oracle
      sudo wget https://download.oracle.com/otn_software/linux/instantclient/版本号/instantclient-basic-linux.x64-版本号.zip
      sudo unzip instantclient basic linux.x64 版本号.zip
      sudo sh -c "echo /opt/oracle/instantclient_版本号 > /etc/ld.so.conf.d/oracle-instantclient.conf"
      sudo ldconfig

      或者直接从Oracle官网下载对应版本的Instant Client安装包,解压后配置环境变量,在用户主目录下的.bashrc文件中添加:

      export LD_LIBRARY_PATH=/path/to/instantclient_版本号:$LD_LIBRARY_PATH
      export ORACLE_HOME=/path/to/instantclient_版本号
      export PATH=$PATH:$ORACLE_HOME

      保存后执行source ~/.bashrc使环境变量生效。

      c语言怎么连接oracle数据库  第1张

编写C语言代码连接Oracle数据库

  1. 包含头文件:根据使用的连接方式,包含相应的头文件,如果使用ODBC连接,需要包含sql.hsqlext.hsqltypes.h等头文件;如果使用OCI连接,需要包含oci.h等相关头文件。

  2. 初始化环境

    • ODBC方式:调用SQLAllocHandle函数分配环境句柄,然后使用SQLSetEnvAttr函数设置ODBC版本属性,接着分配连接句柄。
    • OCI方式:调用OCIInitialize函数初始化OCI环境,再通过OCIEnvCreate函数创建OCI环境句柄,之后使用OCIHandleAlloc函数创建错误句柄、服务器句柄、会话句柄、语句句柄等。
  3. 连接数据库

    • ODBC方式:使用SQLConnect函数连接到数据库,需要提供数据源名称、用户名和密码等参数。
    • OCI方式:首先使用OCIServerAttach函数连接数据库服务器,然后通过OCIAttrSet函数设置用户名、密码等属性,最后调用OCILogonOCILogon2函数进行登录。
  4. 执行SQL语句

    • ODBC方式:分配语句句柄后,使用SQLExecDirect函数执行SQL语句。
    • OCI方式:使用OCIStmtPrepare函数准备SQL语句,然后调用OCIStmtExecute函数执行语句。
  5. 处理结果集

    • ODBC方式:使用SQLFetch函数逐行获取结果集中的数据,然后使用SQLGetData函数获取具体字段的值。
    • OCI方式:使用OCIStmtFetch函数获取结果集数据,并通过OCIDefineByPos函数定义输出变量来接收数据。
  6. 清理资源:在完成数据库操作后,需要释放所有分配的资源,对于ODBC,依次调用SQLFreeHandle函数释放语句句柄、连接句柄和环境句柄;对于OCI,调用OCIHandleFree函数释放各种句柄,最后调用OCITerminate函数结束OCI环境。

示例代码

  1. ODBC示例

    #include <windows.h>
    #include <sql.h>
    #include <sqlext.h>
    int main() {
        SQLHANDLE sqlenvhandle, sqlconnectionhandle, sqlstatementhandle;
        SQLRETURN retcode;
        // Initialize environment
        retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlenvhandle);
        retcode = SQLSetEnvAttr(sqlenvhandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
        retcode = SQLAllocHandle(SQL_HANDLE_DBC, sqlenvhandle, &sqlconnectionhandle);
        // Connect to database
        retcode = SQLConnect(sqlconnectionhandle, "mydatabase", 10, "myusername", 10, "mypassword", 10);
        // Execute SQL statement
        char sql_query = "SELECT  FROM mytable";
        retcode = SQLAllocHandle(SQL_HANDLE_STMT, sqlconnectionhandle, &sqlstatementhandle);
        retcode = SQLExecDirect(sqlstatementhandle, (SQLCHAR)sql_query, SQL_NTS);
        // Fetch results
        int id;
        char name[50];
        while(SQLFetch(sqlstatementhandle) == SQL_SUCCESS) {
            SQLGetData(sqlstatementhandle, 1, SQL_C_LONG, &id, 0, NULL);
            SQLGetData(sqlstatementhandle, 2, SQL_C_CHAR, name, 50, NULL);
            printf("%dt%sn", id, name);
        }
        // Cleanup
        retcode = SQLFreeHandle(SQL_HANDLE_STMT, sqlstatementhandle);
        retcode = SQLDisconnect(sqlconnectionhandle);
        retcode = SQLFreeHandle(SQL_HANDLE_DBC, sqlconnectionhandle);
        retcode = SQLFreeHandle(SQL_HANDLE_ENV, sqlenvhandle);
        return 0;
    }
  2. OCI示例

    #include <oci.h>
    #include <stdio.h>
    #include <string.h>
    // 错误处理函数
    void check_error(OCIError errhp, sword status) {
        text errbuf[512];
        sb4 errcode = 0;
        if (status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO) {
            OCIErrorGet(errhp, 1, NULL, &errcode, errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
            fprintf(stderr, "Error: %sn", errbuf);
            exit(EXIT_FAILURE);
        }
    }
    int main() {
        OCIEnv envhp;
        OCIError errhp;
        OCISvcCtx svchp;
        OCIStmt stmthp;
        text user = (text)"username";
        text password = (text)"password";
        text connstr = (text)"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=your_host)(PORT=your_port)))(CONNECT_DATA=(SERVICE_NAME=your_service_name))";
        text sql[] = "SELECT  FROM your_table";
        // 初始化OCI环境
        OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL);
        OCIEnvCreate(&envhp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
        OCIHandleAlloc(envhp, (dvoid )&errhp, OCI_HTYPE_ERROR, 0, NULL);
        OCIHandleAlloc(envhp, (dvoid )&svchp, OCI_HTYPE_SVCCTX, 0, NULL);
        // 连接到数据库
        if (OCILogon(envhp, errhp, &svchp, user, strlen((const char )user), password, strlen((const char )password), connstr, strlen((const char )connstr)) != OCI_SUCCESS) {
            check_error(errhp, OCI_FAILURE);
        } else {
            printf("Connection successful!n");
        }
        // 分配SQL语句句柄
        OCIHandleAlloc(envhp, (dvoid )&stmthp, OCI_HTYPE_STMT, 0, NULL);
        // 准备和执行SQL语句
        OCIStmtPrepare(stmthp, errhp, sql, strlen((const char )sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
        OCIStmtExecute(svchp, stmthp, errhp, 0, 0, 0, 0, OCI_DEFAULT);
        // 此处省略结果集处理代码,可根据实际需求添加
        // 清理资源
        OCIHandleFree((dvoid )stmthp, OCI_HTYPE_STMT);
        OCILogoff(svchp, errhp);
        OCIHandleFree((dvoid )svchp, OCI_HTYPE_SVCCTX);
        OCIHandleFree((dvoid )errhp, OCI_HTYPE_ERROR);
        OCITerminate(OCI_DEFAULT);
        return 0;
    }

FAQs

  1. Q:使用ODBC连接Oracle数据库时,如何创建ODBC数据源?

    • A:可以使用Windows自带的ODBC数据源管理器程序(odbcad32.exe)来创建ODBC数据源,在管理器中,点击“添加”按钮,选择合适的Oracle驱动程序,然后填写数据源名称、描述、服务器地址、端口号、用户名和密码等信息,完成数据源的创建。
  2. Q:在使用OCI连接Oracle数据库时,出现连接失败的情况,可能是什么原因?

    • A:可能的原因有多种,一是环境变量配置不正确,导致无法找到OCI库文件;二是数据库连接信息错误,如用户名、密码、主机地址、端口号或服务名填写错误;三是网络问题,无法连接到数据库服务器;四是Oracle数据库实例未启动或存在权限问题等。
0