上一篇
c语言怎么连接oracle数据库
- 数据库
- 2025-08-09
- 4
C语言中连接Oracle数据库,通常需要使用Oracle提供的OCI(Oracle Call Interface)库,确保已安装Oracle客户端和OCI开发库,在代码中包含必要的头文件,如
oci.h
,并链接相应的库文件,通过调用OCI函数进行数据库连接、执行SQL语句和处理结果集。
以下是使用C语言连接Oracle数据库的详细步骤:
安装相关软件
-
安装Oracle数据库:从Oracle官网下载适合操作系统版本的Oracle数据库安装包,如Oracle Database Express Edition(适用于Windows和Linux平台),按照安装向导逐步完成安装,安装完成后,确保数据库实例正在运行,并记录实例名称、主机地址、端口号等连接信息。
-
安装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数据库
-
包含头文件:根据使用的连接方式,包含相应的头文件,如果使用ODBC连接,需要包含
sql.h
、sqlext.h
、sqltypes.h
等头文件;如果使用OCI连接,需要包含oci.h
等相关头文件。 -
初始化环境
- ODBC方式:调用
SQLAllocHandle
函数分配环境句柄,然后使用SQLSetEnvAttr
函数设置ODBC版本属性,接着分配连接句柄。 - OCI方式:调用
OCIInitialize
函数初始化OCI环境,再通过OCIEnvCreate
函数创建OCI环境句柄,之后使用OCIHandleAlloc
函数创建错误句柄、服务器句柄、会话句柄、语句句柄等。
- ODBC方式:调用
-
连接数据库
- ODBC方式:使用
SQLConnect
函数连接到数据库,需要提供数据源名称、用户名和密码等参数。 - OCI方式:首先使用
OCIServerAttach
函数连接数据库服务器,然后通过OCIAttrSet
函数设置用户名、密码等属性,最后调用OCILogon
或OCILogon2
函数进行登录。
- ODBC方式:使用
-
执行SQL语句
- ODBC方式:分配语句句柄后,使用
SQLExecDirect
函数执行SQL语句。 - OCI方式:使用
OCIStmtPrepare
函数准备SQL语句,然后调用OCIStmtExecute
函数执行语句。
- ODBC方式:分配语句句柄后,使用
-
处理结果集
- ODBC方式:使用
SQLFetch
函数逐行获取结果集中的数据,然后使用SQLGetData
函数获取具体字段的值。 - OCI方式:使用
OCIStmtFetch
函数获取结果集数据,并通过OCIDefineByPos
函数定义输出变量来接收数据。
- ODBC方式:使用
-
清理资源:在完成数据库操作后,需要释放所有分配的资源,对于ODBC,依次调用
SQLFreeHandle
函数释放语句句柄、连接句柄和环境句柄;对于OCI,调用OCIHandleFree
函数释放各种句柄,最后调用OCITerminate
函数结束OCI环境。
示例代码
-
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; }
-
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
-
Q:使用ODBC连接Oracle数据库时,如何创建ODBC数据源?
- A:可以使用Windows自带的ODBC数据源管理器程序(odbcad32.exe)来创建ODBC数据源,在管理器中,点击“添加”按钮,选择合适的Oracle驱动程序,然后填写数据源名称、描述、服务器地址、端口号、用户名和密码等信息,完成数据源的创建。
-
Q:在使用OCI连接Oracle数据库时,出现连接失败的情况,可能是什么原因?
- A:可能的原因有多种,一是环境变量配置不正确,导致无法找到OCI库文件;二是数据库连接信息错误,如用户名、密码、主机地址、端口号或服务名填写错误;三是网络问题,无法连接到数据库服务器;四是Oracle数据库实例未启动或存在权限问题等。