c 怎么连oracle数据库
- 数据库
- 2025-07-11
- 10
C语言中连接Oracle数据库,通常需要借助Oracle提供的ODBC(Open Database Connectivity)接口或OCI(Oracle Call Interface)接口来实现,以下是使用这两种接口连接Oracle数据库的详细步骤和示例代码。
使用ODBC接口连接Oracle数据库
ODBC是一种通用的数据库访问接口,允许应用程序通过统一的API访问不同的数据库,要在C语言中使用ODBC连接Oracle数据库,需要按照以下步骤操作:
-
安装ODBC驱动程序和Oracle客户端软件:确保系统上已安装适当的ODBC驱动程序和Oracle客户端软件,这些软件可以从Oracle官方网站下载并安装。
-
包含必要的头文件:在C代码中包含必要的头文件,如<stdio.h>、<stdlib.h>和<sql.h>、<sqlext.h>等,这些头文件提供了ODBC API的函数声明和数据类型定义。
-
分配环境句柄:使用SQLAllocHandle()函数分配一个环境句柄(Environment Handle),该句柄用于管理后续的ODBC操作。
-
设置环境属性:使用SQLSetEnvAttr()函数设置环境属性,如设置ODBC版本等。
-
分配连接句柄:使用SQLAllocHandle()函数分配一个连接句柄(Connection Handle),该句柄用于与数据库建立连接。

-
连接数据库:使用SQLConnect()函数配置连接字符串,指定所需的连接参数,例如数据库名、用户名和密码等信息,并尝试与数据库建立连接。
-
执行SQL语句:使用SQLExecDirect()函数执行SQL语句或调用相关的ODBC函数来执行其他数据库操作,如查询数据、插入数据等。
-
获取查询结果:通过SQLFetch()函数获取查询结果集,并根据需要进行处理和输出。
-
断开连接并释放资源:使用SQLDisconnect()函数断开与数据库的连接,并使用SQLFreeHandle()函数释放之前分配的句柄资源。
-
包含必要的头文件:在C代码中包含必要的头文件,如oci.h等,这些头文件提供了OCI API的函数声明和数据类型定义。
-
初始化OCI环境:使用OCIEnvCreate()函数创建一个OCI环境句柄,并设置必要的环境属性。
-
创建错误句柄:使用OCIHandleAlloc()函数为错误处理分配一个句柄,这个句柄将用于捕获和处理OCI函数调用过程中的错误。
-
创建服务器句柄和用户句柄:使用OCIHandleAlloc()函数分别为服务器和用户分配句柄,这些句柄将用于建立与数据库的连接。

-
设置服务器和用户属性:使用OCIAttrSet()函数设置服务器和用户的属性,如数据库的IP地址、端口号、用户名和密码等。
-
建立与数据库的连接:使用OCIServerAttach()函数将服务器句柄附加到用户句柄上,从而建立与数据库的连接。
-
执行SQL语句:使用OCIStmtPrepare()函数准备一个SQL语句,并使用OCIStmtExecute()函数执行该语句,可以通过绑定变量和定义数据类型来传递参数给SQL语句。
-
处理查询结果:如果SQL语句是查询语句,则可以使用OCIStmtFetch()函数获取查询结果集,并根据需要进行处理和输出。
-
断开连接并释放资源:使用OCIServerDetach()函数断开与数据库的连接,并使用OCIHandleFree()函数释放之前分配的句柄资源,使用OCITerminate()函数终止OCI环境。
以下是一个使用ODBC接口连接Oracle数据库的示例代码:

使用OCI接口连接Oracle数据库
OCI是Oracle提供的C语言编程接口,专门用于与Oracle数据库进行交互,与ODBC相比,OCI提供了更底层、更直接的数据库访问方式,以下是使用OCI接口连接Oracle数据库的步骤:
以下是一个使用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; }