当前位置:首页 > 行业动态 > 正文

c 中查询oracle数据库连接

在C语言中查询Oracle数据库连接,通常需要使用Oracle提供的OCI(Oracle Call Interface)库。包含必要的头文件并链接对应的库。初始化OCI环境,创建连接句柄和会话句柄,设置连接属性如用户名、密码、服务名等,最后调用 OCILogon函数建立与数据库的连接。

在C语言中查询Oracle数据库连接,主要涉及到使用OCI(Oracle Call Interface)、ODBC(Open Database Connectivity)接口或Pro*C预编译器等方法,以下是对这些方法的详细阐述:

1、OCI(Oracle Call Interface)

安装和配置OCI:在使用OCI之前,首先需要安装Oracle客户端并配置环境变量,如ORACLE_HOME和LD_LIBRARY_PATH。

编写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);

处理结果集:获取并处理查询结果。

         OCIDefine *defn;
         char result[100];
         OCIHandleAlloc(env, (void)&defn, OCI_HTYPE_DEFINE, 0, NULL);
         OCIDefineByPos(stmt, &defn, err, 1, (void*)result, 100, SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT);
         while (OCIStmtFetch(stmt, err, 1, OCI_FETCH_NEXT, OCI_DEFAULT) == OCI_SUCCESS) {
             printf("Result: %s
", result);
         }

清理资源:释放所有分配的资源。

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

编写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);

连接数据库:使用DSN连接到数据库。

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

处理结果集:获取并处理查询结果。

         SQLCHAR result[100];
         SQLBindCol(stmt, 1, SQL_C_CHAR, result, sizeof(result), NULL);
         while (SQLFetch(stmt) == SQL_SUCCESS) {
             printf("Result: %s
", result);
         }

清理资源:释放所有分配的资源。

         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环境。

**编写Pro*C程序**:在Pro*C程序中,可以直接嵌入SQL语句。

     #include <stdio.h>
     #include <string.h>
     #include <stdlib.h>
     EXEC SQL INCLUDE SQLCA;
     int main()
     {
         EXEC SQL BEGIN DECLARE SECTION;
         VARCHAR usr[20],pass[20],serv[20]; //usr用户名,pass密码,serv数据库服务名
         char emp_name[20];
         int emp_id;
         EXEC SQL END DECLARE SECTION;
         strcpy(usr.arr,"test01");
         usr.len=(unsigned short)strlen((char *)usr.arr);
         strcpy(pass.arr,"111111");
         pass.len=(unsigned short)strlen((char *)pass.arr);
         strcpy(serv.arr,"orcl");
         serv.len=(unsigned short)strlen((char *)serv.arr);
         EXEC SQL CONNECT :usr IDENTIFIED BY :pass USING :serv;
         //判断是否连接到数据库
         if(sqlca.sqlcode) {
             printf("ORA-ERROR: sqlca.sqlcode=%d
",sqlca.sqlcode);
             exit(0);
         }
         printf("Connect!
");
         printf("please input id:");
         scanf("%d",&emp_id);
         //查询语句
         EXEC SQL SELECT emp_id , emp_name into :emp_id,:emp_name from emp where emp_id=:emp_id;
         printf("Name=%s
", emp_name);
         EXEC SQL COMMIT WORK RELEASE;
         printf("Disconnect!
");
         return 0;
     }

编译和运行上述代码时,需要确保正确设置了Oracle客户端的环境变量,并且Pro*C预编译器能够找到相关的头文件和库文件,编译命令可能类似于:proc test.pc,生成可执行文件后,可以通过命令行运行它来测试与Oracle数据库的连接和查询功能。

C语言中查询Oracle数据库连接的方法多种多样,选择哪种方法取决于具体的应用场景和需求,无论使用哪种方法,都需要确保正确处理错误、管理内存和资源,以确保程序的稳定性和效率。

0