如何实现C系统与Oracle数据库的有效连接?

要在C系统中连接Oracle数据库,需要安装Oracle客户端库并使用OCI(Oracle Call Interface)或ODBC API进行编程。

在C语言中连接Oracle数据库,可以通过多种方式实现,以下是几种常见的方法及其详细步骤:

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)。

c系统连接oracle数据库

     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语句。

c系统连接oracle数据库

创建超女信息表:创建一个名为“超女”的信息表。

     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<

(0)
运维的头像运维
上一篇2024-12-02 02:35
下一篇 2024-12-02 02:40

相关推荐

发表回复

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