c 怎么连oracle数据库

Oracle数据库需获取主机名、端口号、服务名称、用户名和密码,通过SQLPlus、SQL Developer、JDBC或ODBC等方法建立连接

C语言中连接Oracle数据库,通常需要借助Oracle提供的ODBC(Open Database Connectivity)接口或OCI(Oracle Call Interface)接口来实现,以下是使用这两种接口连接Oracle数据库的详细步骤和示例代码。

c 怎么连oracle数据库

使用ODBC接口连接Oracle数据库

ODBC是一种通用的数据库访问接口,允许应用程序通过统一的API访问不同的数据库,要在C语言中使用ODBC连接Oracle数据库,需要按照以下步骤操作:

  1. 安装ODBC驱动程序和Oracle客户端软件:确保系统上已安装适当的ODBC驱动程序和Oracle客户端软件,这些软件可以从Oracle官方网站下载并安装。

  2. 包含必要的头文件:在C代码中包含必要的头文件,如<stdio.h><stdlib.h><sql.h><sqlext.h>等,这些头文件提供了ODBC API的函数声明和数据类型定义。

  3. 分配环境句柄:使用SQLAllocHandle()函数分配一个环境句柄(Environment Handle),该句柄用于管理后续的ODBC操作。

  4. 设置环境属性:使用SQLSetEnvAttr()函数设置环境属性,如设置ODBC版本等。

  5. 分配连接句柄:使用SQLAllocHandle()函数分配一个连接句柄(Connection Handle),该句柄用于与数据库建立连接。

  6. 连接数据库:使用SQLConnect()函数配置连接字符串,指定所需的连接参数,例如数据库名、用户名和密码等信息,并尝试与数据库建立连接。

  7. 执行SQL语句:使用SQLExecDirect()函数执行SQL语句或调用相关的ODBC函数来执行其他数据库操作,如查询数据、插入数据等。

    c 怎么连oracle数据库

  8. 获取查询结果:通过SQLFetch()函数获取查询结果集,并根据需要进行处理和输出。

  9. 断开连接并释放资源:使用SQLDisconnect()函数断开与数据库的连接,并使用SQLFreeHandle()函数释放之前分配的句柄资源。

以下是一个使用ODBC接口连接Oracle数据库的示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#include <sqlext.h>
int main() {
    SQLHENV env;
    SQLHDBC dbc;
    SQLRETURN ret; / ODBC API return status /
    // Allocate an environment handle
    ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
    if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
        printf("Error allocating environment handle
");
        return EXIT_FAILURE;
    }
    // Set the ODBC version environment attribute
    ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void )SQL_OV_ODBC3, 0);
    if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
        printf("Error setting environment attribute
");
        SQLFreeHandle(SQL_HANDLE_ENV, env);
        return EXIT_FAILURE;
    }
    // Allocate a connection handle
    ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
    if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
        printf("Error allocating connection handle
");
        SQLFreeHandle(SQL_HANDLE_ENV, env);
        return EXIT_FAILURE;
    }
    // Connect to the Oracle database
    ret = SQLConnect(dbc, (SQLCHAR )"mydb", SQL_NTS, (SQLCHAR )"user", SQL_NTS, (SQLCHAR )"password", SQL_NTS);
    if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
        printf("Error connecting to database
");
        SQLFreeHandle(SQL_HANDLE_DBC, dbc);
        SQLFreeHandle(SQL_HANDLE_ENV, env);
        return EXIT_FAILURE;
    }
    // Execute an SQL query
    ret = SQLExecDirect(dbc, (SQLCHAR )"SELECT  FROM mytable", SQL_NTS);
    if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
        printf("Error executing SQL query
");
    } else {
        // Process the query results here...
    }
    // Disconnect from the database and free resources
    SQLDisconnect(dbc);
    SQLFreeHandle(SQL_HANDLE_DBC, dbc);
    SQLFreeHandle(SQL_HANDLE_ENV, env);
    return EXIT_SUCCESS;
}

使用OCI接口连接Oracle数据库

OCI是Oracle提供的C语言编程接口,专门用于与Oracle数据库进行交互,与ODBC相比,OCI提供了更底层、更直接的数据库访问方式,以下是使用OCI接口连接Oracle数据库的步骤:

  1. 包含必要的头文件:在C代码中包含必要的头文件,如oci.h等,这些头文件提供了OCI API的函数声明和数据类型定义。

  2. 初始化OCI环境:使用OCIEnvCreate()函数创建一个OCI环境句柄,并设置必要的环境属性。

  3. 创建错误句柄:使用OCIHandleAlloc()函数为错误处理分配一个句柄,这个句柄将用于捕获和处理OCI函数调用过程中的错误。

  4. 创建服务器句柄和用户句柄:使用OCIHandleAlloc()函数分别为服务器和用户分配句柄,这些句柄将用于建立与数据库的连接。

    c 怎么连oracle数据库

  5. 设置服务器和用户属性:使用OCIAttrSet()函数设置服务器和用户的属性,如数据库的IP地址、端口号、用户名和密码等。

  6. 建立与数据库的连接:使用OCIServerAttach()函数将服务器句柄附加到用户句柄上,从而建立与数据库的连接。

  7. 执行SQL语句:使用OCIStmtPrepare()函数准备一个SQL语句,并使用OCIStmtExecute()函数执行该语句,可以通过绑定变量和定义数据类型来传递参数给SQL语句。

  8. 处理查询结果:如果SQL语句是查询语句,则可以使用OCIStmtFetch()函数获取查询结果集,并根据需要进行处理和输出。

  9. 断开连接并释放资源:使用OCIServerDetach()函数断开与数据库的连接,并使用OCIHandleFree()函数释放之前分配的句柄资源,使用OCITerminate()函数终止OCI环境。

以下是一个使用OCI接口连接Oracle数据库的示例代码:

#include <oci.h>
#include <stdio.h>
#include <string.h>
int main() {
    OCIEnv envhp;
    OCIError errhp;
    OCISvcCtx svchp;
    OCIStmt stmtp;
    OCIInd indicator;
    text userid[32];
    text password[32];
    text dbname[64];
    int rcode;
    // Initialize the OCI environment
    rcode = OCIEnvCreate((dvoid )&envhp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
    if (rcode != OCI_SUCCESS) {
        printf("Error initializing OCI environment
");
        return EXIT_FAILURE;
    }
    // Allocate an error handle
    rcode = OCIHandleAlloc((dvoid )envhp, (dvoid )&errhp, OCI_HTYPE_ERROR, (size_t)0, (dvoid )NULL);
    if (rcode != OCI_SUCCESS) {
        printf("Error allocating error handle
");
        OCIHandleFree((dvoid )errhp, OCI_HTYPE_ERROR);
        OCIEnvDestroy((dvoid )envhp, OCI_DEFAULT);
        return EXIT_FAILURE;
    }
    // Set the error handle for the environment
    rcode = OCIHandleSet((dvoid )envhp, (dvoid )&errhp, OCI_HTYPE_ERROR, (size_t)0);
    if (rcode != OCI_SUCCESS) {
        printf("Error setting error handle for environment
");
        OCIHandleFree((dvoid )errhp, OCI_HTYPE_ERROR);
        OCIEnvDestroy((dvoid )envhp, OCI_DEFAULT);
        return EXIT_FAILURE;
    }
    // Allocate a server handle and a user handle
    OCISrvCtxAlloc(envhp, errhp, &svchp);
    OCIHandleAlloc(envhp, (dvoid )&svchp, OCI_HTYPE_SVCCTX, (size_t)0, (dvoid )NULL);
    OCIHandleAlloc(envhp, (dvoid )&svchp, OCI_HTYPE_USER, (size_t)0, (dvoid )NULL);
    // Set the server and user attributes
    strcpy((char )userid, "myuser"); // Replace with your username
    strcpy((char )password, "mypassword"); // Replace with your password
    strcpy((char )dbname, "mydb"); // Replace with your database name or SID
    rcode = OCIAttrSet((dvoid )svchp, OCI_HTYPE_SVCCTX, (dvoid )userid, 0, OCI_ATTR_USERNAME, errhp);
    rcode = OCIAttrSet((dvoid )svchp, OCI_HTYPE_SVCCTX, (dvoid )password, 0, OCI_ATTR_PASSWORD, errhp);
    rcode = OCIAttrSet((dvoid )svchp, OCI_HTYPE_SVCCTX, (dvoid )dbname, 0, OCI_ATTR_DBNAME, errhp);
    // Attach to the server
    rcode = OCIServerAttach(svchp, errhp, (text )NULL, 0);
    if (rcode != OCI_SUCCESS) {
        printf("Error attaching to server
");
        OCIHandleFree((dvoid )svchp, OCI_HTYPE_SVCCTX);
        OCIHandleFree((dvoid )errhp, OCI_HTYPE_ERROR);
        OCIEnvDestroy((dvoid )envhp, OCI_DEFAULT);
        return EXIT_FAILURE;
    }
    // Prepare and execute an SQL statement
    text sqlstmt[] = "SELECT  FROM mytable"; // Replace with your SQL statement
    rcode = OCIStmtPrepare(svchp, errhp, (text )sqlstmt, strlen((char )sqlstmt), OCI_NTV_SYNTAX, OCI_DEFAULT, 0, (dvoid )&stmtp, (ub4 )NULL);
    if (rcode != OCI_SUCCESS) {
        printf("Error preparing SQL statement
");
        OCIServerDetach(svchp, errhp, OCI_DEFAULT);
        OCIHandleFree((dvoid )svchp, OCI_HTYPE_SVCCTX);
        OCIHandleFree((dvoid )errhp, OCI_HTYPE_ERROR);
        OCIEnvDestroy((dvoid )envhp, OCI_DEFAULT);
        return EXIT_FAILURE;
    }
    rcode = OCIStmtExecute(svchp, stmtp, errhp, 1, (ub4 )NULL, NULL, NULL, OCI_DEFAULT);
    if (rcode != OCI_SUCCESS) {
        printf("Error executing SQL statement
");
        OCIHandleFree((dvoid )stmtp, OCI_HTYPE_STMT);
        OCIServerDetach(svchp, errhp, OCI_DEFAULT);
        OCIHandleFree((dvoid )svchp, OCI_HTYPE_SVCCTX);
        OCIHandleFree((dvoid )errhp, OCI_HTYPE_ERROR);
        OCIEnvDestroy((dvoid )envhp, OCI_DEFAULT);
        return EXIT_FAILURE;
    }
    // Fetch and process the query results here...
    // For example: while ((rcode = OCIStmtFetch(stmtp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) == OCI_SUCCESS || rcode == OCI_SUCCESS_WITH_INFO) { ... }
    // Clean up and disconnect from the database
    OCIHandleFree((dvoid )stmtp, OCI_HTYPE_STMT);
    OCIServerDetach(svchp, errhp, OCI_DEFAULT);
    OCIHandleFree((dvoid )svchp, OCI_HTYPE_SVCCTX);
    OCIHandleFree((dvoid )errhp, OCI_HTYPE_ERROR);
    OCIEnvDestroy((dvoid )envhp, OCI_DEFAULT);
    return EXIT_SUCCESS;
}

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/54070.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年7月11日 07:43
下一篇 2025年7月11日 07:46

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN