Oracle数据库与C语言互通之道(oracle c语言接口)
Oracle数据库与C语言互通之道
Oracle数据库是世界领先的企业级数据库管理系统,许多企业都采用Oracle数据库来管理其重要数据。与此同时,C语言作为一种高效而又广泛应用的编程语言,也被许多企业所采用。如何让Oracle数据库与C语言互通,具有一定的实际意义。本文将介绍Oracle数据库与C语言互通的几种方式,并演示相关代码。
1.使用Oracle提供的OCI接口
OCI(Oracle Call Interface,Oracle调用接口)是Oracle针对C程序员提供的一组函数库,用于在C语言中访问Oracle数据库的数据。OCI接口提供了一个API,允许开发者以C语言的方式直接访问Oracle数据库。使用OCI可以实现高效的数据访问,而且OCI非常稳定,并且具有足够的功能和灵活性,因此被广泛使用。
下面是一个使用OCI实现连接Oracle数据库并查询数据的示例程序:
“` c
#include
#include
int mn(int argc, char *argv[]) {
OCIEnv *envhp; /* OCI Environment Handle */
OCISvcCtx *svchp; /* OCI Service Context Handle */
OCIError *errhp; /* OCI Error Handle */
OCIStmt *stmthp; /* OCI Statement Handle */
OCIDefine *defnp; /* OCI Define Handle */
char *selectStmt = “SELECT * FROM employees”;
int selectStmtLen = strlen(selectStmt);
char *username = “scott”;
char *password = “tiger”;
char *database = “XE”;
ub4 status;
/* initialize OCI environment */
if (OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL) != OCI_SUCCESS) {
printf(“Unable to create OCI environment\n”);
return -1;
}
/* allocate error handle */
OCIHandleAlloc(envhp, (void **)&errhp, OCI_HTYPE_ERROR, 0, NULL);
/* allocate service context handle */
OCIHandleAlloc(envhp, (void **)&svchp, OCI_HTYPE_SVCCTX, 0, NULL);
/* attach to database */
status = OCILogon2(envhp, errhp, &svchp, (oratext *)username, strlen(username), (oratext *)password, strlen(password), (oratext *)database, strlen(database), OCI_DEFAULT);
if (status != OCI_SUCCESS) {
printf(“Unable to connect to Oracle database\n”);
return -1;
}
/* allocate statement handle */
OCIHandleAlloc(envhp, (void **)&stmthp, OCI_HTYPE_STMT, 0, NULL);
/* prepare SQL statement */
OCIStmtPrepare(stmthp, errhp, (const OraText *)selectStmt, selectStmtLen, OCI_NTV_SYNTAX, OCI_DEFAULT);
/* define column */
OCIStmtExecute(svchp, stmthp, errhp, 1, 0, NULL, NULL, OCI_DESCRIBE_ONLY);
/* bind column */
OCIStmtPrepare(stmthp, errhp, (const OraText *)selectStmt, selectStmtLen, OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(svchp, stmthp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
OCIDefineByPos(stmthp, &defnp, errhp, 1, (void *)employees, sizeof(employees[0]), SQLT_NTY, (void *)0, (void *)0, (void *)0, OCI_DEFAULT);
/* fetch rows */
while (OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) == OCI_SUCCESS) {
/* do something with result */
}
/* free resources */
OCILogoff(svchp, errhp);
OCIHandleFree(stmthp, OCI_HTYPE_STMT);
OCIHandleFree(svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
OCIHandleFree(envhp, OCI_HTYPE_ENV);
return 0;
}
2.使用ODBC连接Oracle数据库
ODBC(Open Database Connectivity,开放式数据库连接)是一种开放的数据库连接标准,允许应用程序连接各种数据库,包括Oracle数据库。在C语言中,可以使用ODBC API来连接Oracle数据库,可移植性较好,支持多平台。
下面是一个使用ODBC API连接Oracle数据库并查询数据的示例程序:
``` c#include
#include
#include
#include
#define MAX_COL 1000#define MAX_DAT 1024
int mn(int argc, char** argv) { SQLHENV henv;
SQLHDBC hdbc; SQLHSTMT hstmt;
SQLRETURN retcode; char connstr[1024];
char selectstmt[1024];
SQLCHAR colname[MAX_COL][MAX_DAT]; SQLCHAR bindata[MAX_COL][MAX_DAT];
SQLLEN indicator[MAX_COL]; SQLLEN pos[MAX_COL], size[MAX_COL], slen[MAX_COL];
int i, j;
/* Allocate environment handle */ SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
/* Set the environment attribute */ SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
/* Allocate connection handle */ SQLAllocHandle(SQL_HANDLE_DBC, henv, &(hdbc));
/* Construct connection string */ sprintf(connstr, "DSN=%s;UID=%s;PWD=%s", "mydb", "oracleuser", "oraclepassword");
/* Connect to the database */ SQLDriverConnect(hdbc, NULL, (SQLCHAR *)connstr, strlen(connstr), NULL, 0, NULL, SQL_DRIVER_COMPLETE);
/* Allocate statement handle */ SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &(hstmt));
/* Construct SQL statement */ sprintf(selectstmt, "SELECT * FROM employees");
/* Execute SQL statement */ SQLExecDirect(hstmt, (SQLCHAR *)selectstmt, SQL_NTS);
/* Get column information */ SQLNumResultCols(hstmt, (SQLSMALLINT*)&i);
for (j = 0; j SQLDescribeCol(hstmt, j + 1, colname[j], MAX_DAT, &slen[j], NULL, NULL, NULL, NULL);
size[j] = slen[j] + 1; SQLBindCol(hstmt, j + 1, SQL_C_CHAR, bindata[j], size[j], &indicator[j]);
printf("%s\t", colname[j]); }
printf("\n");
/* Fetch the rows */ while ((retcode = SQLFetch(hstmt)) != SQL_NO_DATA) {
for (j = 0; j printf("%s\t", bindata[j]);
} printf("\n");
}
/* Free resources */ SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;}
总结
本文介绍了Oracle数据库与C语言互通的两种方式:使用Oracle提供的OCI接口和使用ODBC连接Oracle数据库。使用OCI接口可以实现高效的数据访问,并具有较好的稳定性和灵活性;使用ODBC可移植性较好,并且支持多平台。无论采用什么方式,都可以实现Oracle数据库与C语言的互通,并为企业级应用的开发和维护提供了一种有效的方法。