在C语言中连接Oracle数据库,可以通过多种方式实现,以下是几种常见的方法及其详细步骤:
1、OCI(Oracle Call Interface)
安装和配置OCI:在使用OCI之前,首先需要安装Oracle客户端并配置环境变量,如ORACLE_HOME和LD_LIBRARY_PATH。
export ORACLE_HOME=/path/to/oracle/client export LD_LIBRARY_PATH=$ORACLE_HOME/lib
编写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语句:执行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);
清理资源:在程序结束时,清理分配的资源。
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)。
odbcinst -i -d -f /path/to/odbcinst.ini odbcinst -i -s -l -f /path/to/odbc.ini
编写ODBC程序
初始化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语句:执行SQL语句并处理结果集。
SQLHSTMT stmt; SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); SQLExecDirect(stmt, (SQLCHAR*)"SELECT * FROM mytable", SQL_NTS);
清理资源:释放分配的ODBC句柄。
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环境。
export ORACLE_HOME=/path/to/oracle/client export PATH=$ORACLE_HOME/bin:$PATH
**编写Pro*C程序**:嵌入SQL语句到C代码中。
#include <stdio.h> #include <stdlib.h> EXEC SQL INCLUDE SQLCA; int main() { EXEC SQL BEGIN DECLARE SECTION; VARCHAR user[20], pass[20], tnsname[20]; char ename[20]; int empno; EXEC SQL END DECLARE SECTION; strcpy(user.arr,"umail"); user.len=(unsigned short)strlen((char *)user.arr); strcpy(pass.arr,"umail"); pass.len=(unsigned short)strlen((char *)pass.arr); strcpy(tnsname.arr,"umail"); tnsname.len=(unsigned short)strlen((char *)tnsname.arr); EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :tnsname; EXEC SQL declare emp_cursor cursor for select id,ename from umail.tt1; EXEC SQL open emp_cursor; EXEC SQL WHENEVER NOT FOUND DO break; while(1) { EXEC SQL fetch emp_cursor into :empno, :ename; printf("the empno %d/'s name is %s/n", empno, ename); } printf("Yeah!We get %d records/n", i); EXEC SQL close emp_cursor; EXEC SQL commit work release; }
编译和执行:使用Pro*C编译器编译并执行程序。
proc test.pc gcc -o test test.c -lclntsh
4、使用freecplus框架:freecplus框架将OCI封装成connection和sqlstatement类,简化了操作,以下是一个简单的示例,展示如何使用freecplus框架连接Oracle数据库并执行SQL语句。
创建超女信息表:创建一个名为“超女”的信息表。
CREATE TABLE supergirl (id number(10), name varchar2(50));
向超女表中插入记录:向表中插入5条记录。
connection con; con.connecttodb("scott/tiger@orcl", "UTF8"); con.execute("replace into supergirl values(%d, '%s')", 1, "李宇春"); con.execute("replace into supergirl values(%d, '%s')", 2, "周笔畅"); con.execute("replace into supergirl values(%d, '%s')", 3, "张靓颖"); con.execute("replace into supergirl values(%d, '%s')", 4, "何洁"); con.execute("replace into supergirl values(%d, '%s')", 5, "纪敏佳"); con.disconnect();
更新超女表中的记录:更新表中的记录。
connection con; con.connecttodb("scott/tiger@orcl", "UTF8"); con.execute("update supergirl set name='李宇春成都' where id=1"); con.disconnect();
查询超女表中的记录:查询表中的所有记录。
connection con; con.connecttodb("scott/tiger@orcl", "UTF8"); resultset *rs = con.execute("select * from supergirl"); while (!rs->EOF()) { printf("%ld, %sn", rs->GetLong("id"), rs->GetString("name").c_str()); rs->MoveNext(); } rs->Close(); delete rs; con.disconnect();
查询超女表中的记录数:查询表中的记录数。
connection con; con.connecttodb("scott/tiger@orcl", "UTF8"); int count = con.execute("select count(*) from supergirl").GetInt(); printf("count: %dn", count); con.disconnect();
删除超女表中的记录:删除表中的记录。
connection con; con.connecttodb("scott/tiger@orcl", "UTF8"); con.execute("delete from supergirl where id=1"); con.disconnect();
执行PL/SQL过程:执行存储过程。
connection con; con.connecttodb("scott/tiger@orcl", "UTF8"); con.execute("begin supergirl_pkg.addsupergirl(1, '李宇春'); end;"); con.disconnect();
CLOB和BLOB字段的操作:对CLOB和BLOB字段进行操作。
connection con; con.connecttodb("scott/tiger@orcl", "UTF8"); con.execute("update supergirl set image=:image where id=1", (const void*)img, imgLen); con.disconnect();
相关问题与解答栏目:
1、如何在本地环境中使用C语言连接Oracle数据库?
回答:在本地环境中使用C语言连接Oracle数据库,可以通过以下步骤实现:查看并设置Oracle相关的环境变量,确保Oracle客户端已正确安装,通过编写OCI、ODBC或Pro*C程序来连接本地数据库,使用OCI时,可以按照以下步骤进行:初始化OCI环境,连接数据库,执行SQL语句,最后清理资源,具体代码可以参考上述OCI部分的示例。
2、如何在远程环境中使用C语言连接Oracle数据库?
回答:在远程环境中使用C语言连接Oracle数据库,需要确保远程服务器上已安装Oracle客户端,并且网络配置正确,连接步骤与本地连接类似,但需要在连接字符串中指定远程服务器的地址和端口,使用ODBC时,可以在DSN中指定远程服务器的连接信息,具体步骤可以参考上述ODBC部分的示例。
到此,以上就是小编对于“c系统连接oracle数据库”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/1192.html<