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数据库。


数据运维技术 » C语言连接Oracle 11g数据库的实践(c 连oracle11g)