C语言连接Oracle 11g数据库的实践(c 连oracle11g)
C语言连接Oracle 11g数据库的实践
随着Oracle数据库在企业级应用领域中的广泛应用,越来越多的程序员需要学习如何使用C语言来连接Oracle数据库。本文将介绍如何使用C语言连接Oracle 11g数据库的实践方法。
需要在本地安装Oracle 11g数据库,并且配置好环境变量。接下来,需要下载Oracle库文件,这里以Windows平台下的OCI库文件为例。OCI(Oracle Call Interface)是Oracle提供的面向C语言开发者的接口,开发者可以使用OCI来编写程序访问Oracle数据库。
在安装OCI库文件之前,需要保证C语言能够找到OCI库文件。可以通过添加系统环境变量等方式来实现。同时,还需要将OCI库文件存放到特定的目录下,以便C语言编译时能够找到库文件。
接下来,可以开始编写C程序。在编写C程序之前,需要包含OCI库头文件,并且使用OCI库提供的函数来连接Oracle数据库。以下是一个简单的样例代码,程序的功能是连接Oracle数据库并输出其中的一张表格的数据。
#include
#include
int mn(void) { OCIEnv *env = NULL;
OCIServer *srv = NULL; OCIError *err = NULL;
OCISession *sess = NULL; OCIStmt *stmt = NULL;
OCIDefine *def = NULL; sword ret;
// Initialize the environment ret = OCIEnvCreate(&env, OCI_THREADED|OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL);
if (ret != OCI_SUCCESS) { printf("Error initializing OCI environment\n");
return 1; }
// Create a server context ret = OCIHandleAlloc(env, (dvoid**)&srv, OCI_HTYPE_SERVER, 0, NULL);
if (ret != OCI_SUCCESS) { printf("Error creating server context\n");
return 1; }
// Attach to the server ret = OCIServerAttach(srv, err, (text*)"//localhost:1521/orcl", strlen("//localhost:1521/orcl"), OCI_DEFAULT);
if (ret != OCI_SUCCESS) { printf("Error attaching to server\n");
return 1; }
// Create a session ret = OCIHandleAlloc(env, (dvoid**)&sess, OCI_HTYPE_SESSION, 0, NULL);
if (ret != OCI_SUCCESS) { printf("Error creating session\n");
return 1; }
// Set the username and password ret = OCIAttrSet(sess, OCI_HTYPE_SESSION, (dvoid*)"username", strlen("username"), OCI_ATTR_USERNAME, err);
if (ret != OCI_SUCCESS) { printf("Error setting username\n");
return 1; }
ret = OCIAttrSet(sess, OCI_HTYPE_SESSION, (dvoid*)"password", strlen("password"), OCI_ATTR_PASSWORD, err); if (ret != OCI_SUCCESS) {
printf("Error setting password\n"); return 1;
}
// Establish a session ret = OCISessionBegin(srv, err, sess, OCI_CRED_RDBMS, OCI_DEFAULT);
if (ret != OCI_SUCCESS) { printf("Error establishing session\n");
return 1; }
// Allocate a statement ret = OCIHandleAlloc(env, (dvoid**)&stmt, OCI_HTYPE_STMT, 0, NULL);
if (ret != OCI_SUCCESS) { printf("Error allocating statement\n");
return 1; }
// Prepare the SQL statement ret = OCIStmtPrepare(stmt, err, (text*)"SELECT * FROM employees", strlen("SELECT * FROM employees"), OCI_NTV_SYNTAX, OCI_DEFAULT);
if (ret != OCI_SUCCESS) { printf("Error preparing SQL statement\n");
return 1; }
// Define the output variable int empno;
char ename[20]; float salary;
ret = OCIDefineByPos(stmt, &def, err, 1, &empno, sizeof(int), SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT); ret = OCIDefineByPos(stmt, &def, err, 2, &ename, sizeof(ename), SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT);
ret = OCIDefineByPos(stmt, &def, err, 3, &salary, sizeof(float), SQLT_FLT, NULL, NULL, NULL, OCI_DEFAULT);
// Execute the query ret = OCIStmtExecute(srv, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT);
if (ret != OCI_SUCCESS) { printf("Error executing SQL statement\n");
return 1; }
// Fetch the results printf("| Empno | Ename | Salary |\n");
printf("--------------------------\n"); while (OCIStmtFetch(stmt, err, 1, OCI_FETCH_NEXT, OCI_DEFAULT) == OCI_SUCCESS) {
printf("| %5d | %-6s | %6.2f |\n", empno, ename, salary); }
// Clean up OCIHandleFree(stmt, OCI_HTYPE_STMT);
OCISessionEnd(srv, err, sess, OCI_DEFAULT); OCIServerDetach(srv, err, OCI_DEFAULT);
OCIHandleFree(srv, OCI_HTYPE_SERVER); OCIHandleFree(sess, OCI_HTYPE_SESSION);
OCIHandleFree(env, OCI_HTYPE_ENV);
return 0;}
在编译C程序之前,需要确定OCI库文件是否被正确地安装和配置。可以使用以下命令进行编译:
gcc -o test test.c -I$ORACLE_HOME/include -L$ORACLE_HOME/lib -lclntsh
需要将“$ORACLE_HOME“替换为实际的安装目录。
在运行C程序时,如果出现以下错误:
OCI_INVALID_HANDLE: Invalid Handle
则可能是OCI库文件未能正确地加载。可以检查是否配置正确。
使用C语言连接Oracle 11g数据库需要掌握OCI库的使用方法,包括初始化OCI环境、创建服务器上下文、连接服务器、创建会话、执行SQL语句等操作。只要熟练掌握OCI库的使用方法,就可以方便地使用C语言访问Oracle 11g数据库。