C语言编程从Oracle中取得有效输出(c 获取oracle输出)
C语言编程:从Oracle中取得有效输出
在C语言的开发中,使用Oracle数据库是一个很常见的情况。当我们需要从数据库中获取有效的输出时,我们需要一些技巧来帮助我们实现这一点。 在本文中,我们将介绍从Oracle中获取有效输出的方法。
使用ODBC驱动程序
第一种方法是使用ODBC驱动程序。 ODBC(Open Database Connectivity)是一种数据库接口技术,它可以使程序与不同类型的数据库进行通讯。Oracle提供了ODBC驱动程序,可以方便地在C程序中使用。
需要安装ODBC驱动程序。然后,我们需要打开ODBC配置器,并创建一个数据源名称(DSN)。
“`c
#include
#include
#include
char szDSN[] = “OracleDSN”;
char szUID[] = “username”;
char szPWD[] = “password”;
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;
void handleError(SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt, char* errorSource)
{
SQLCHAR sqlState[6], messageText[256];
SQLINTEGER nativeError;
SQLSMALLINT textLength;
SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, sqlState, &nativeError, messageText,
sizeof(messageText), &textLength);
fprintf(stderr, “%s SQLSTATE = %s\n”, errorSource, sqlState);
}
int mn(int argc, char *argv[])
{
retcode = SQLAllocEnv(&henv);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
{
handleError(henv, NULL, NULL, “SQLAllocEnv error”);
return -1;
}
retcode = SQLAllocConnect(henv, &hdbc);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
{
handleError(henv, hdbc, NULL, “SQLAllocConnect error”);
return -1;
}
retcode = SQLConnect(hdbc, (SQLCHAR*)szDSN, SQL_NTS, (SQLCHAR*)szUID, SQL_NTS,
(SQLCHAR*)szPWD, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
{
handleError(henv, hdbc, NULL, “SQLConnect error”);
return -1;
}
retcode = SQLAllocStmt(hdbc, &hstmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
{
handleError(henv, hdbc, hstmt, “SQLAllocStmt error”);
return -1;
}
retcode = SQLExecDirect(hstmt, (SQLCHAR*)”SELECT * FROM employees”, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
{
handleError(henv, hdbc, hstmt, “SQLExecDirect error”);
return -1;
}
SQLCHAR empName[256];
SQLINTEGER empId;
while((retcode = SQLFetch(hstmt)) == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLGetData(hstmt, 1, SQL_C_CHAR, empName, sizeof(empName), NULL);
SQLGetData(hstmt, 2, SQL_C_LONG, &empId, 0, NULL);
printf(“%s %d\n”, empName, empId);
}
SQLFreeStmt(hstmt, SQL_CLOSE);
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
return 0;
}
使用OCI API
另一种方法是使用OCI API。OCI(Oracle Call Interface)是Oracle提供的一组C API,可以方便地在C程序中使用。
需要包含OCI头文件和库,如下所示:
```c#include
#pragma comment(lib,"oci.lib")
char szHost[] = "localhost";char szPort[] = "1521";
char szServiceName[] = "ORCL";char szUsername[] = "username";
char szPassword[] = "password";
int mn(int argc, char *argv[]){
OCIEnv* env = NULL; OCIError* err = NULL;
OCIServer* srv = NULL; OCISession* ses = NULL;
OCIStmt* stmt = NULL;
OCIInitialize(OCI_DEFAULT); OCIHandleAlloc(env, (void**)&env, OCI_HTYPE_ENV, 0, NULL);
OCIHandleAlloc(env, (void**)&err, OCI_HTYPE_ERROR, 0, NULL);
OCIHandleAlloc(env, (void**)&srv, OCI_HTYPE_SERVER, 0, NULL); OCIServerAttach(srv, err, (text*)szServiceName, strlen(szServiceName), 0);
OCIHandleAlloc(env, (void**)&ses, OCI_HTYPE_SESSION, 0, NULL); OCISessionBegin(srv, err, ses, OCI_CRED_RDBMS, OCI_DEFAULT);
OCIAttrSet(ses, OCI_HTYPE_SESSION, (text*)szUsername, strlen(szUsername), OCI_ATTR_USERNAME, err); OCIAttrSet(ses, OCI_HTYPE_SESSION, (text*)szPassword, strlen(szPassword), OCI_ATTR_PASSWORD, err);
OCISessionBegin(srv, err, ses, OCI_CRED_RDBMS, OCI_DEFAULT);
OCIHandleAlloc(env, (void**)&stmt, OCI_HTYPE_STMT, 0, NULL); OCIStmtPrepare(stmt, err, (text*)"select * from employees",
strlen("select * from employees"), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(ses, stmt, err, 0, 0, 0, 0, OCI_DEFAULT);
OCIDefine* def1 = NULL; OCIHandleAlloc(env, (void**)&def1, OCI_HTYPE_DEFINE, 0, NULL);
OCIDefineByPos(stmt, &def1, err, 1, NULL, 0, SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT);
OCIDefine* def2 = NULL; OCIHandleAlloc(env, (void**)&def2, OCI_HTYPE_DEFINE, 0, NULL);
OCIDefineByPos(stmt, &def2, err, 2, NULL, 0, SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT);
char empName[256]; int empId;
while(OCIStmtFetch(stmt, err, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA) {
OCIDefineGetData(def1, err, empName, sizeof(empName), OCI_FETCH_NEXT); OCIDefineGetData(def2, err, &empId, sizeof(empId), OCI_FETCH_NEXT);
printf("%s %d\n", empName, empId); }
OCIHandleFree(err, OCI_HTYPE_ERROR); OCIHandleFree(srv, OCI_HTYPE_SERVER);
OCIHandleFree(ses, OCI_HTYPE_SESSION); OCIHandleFree(stmt, OCI_HTYPE_STMT);
OCIHandleFree(env, OCI_HTYPE_ENV);
return 0;}
使用OCI需要明确的是OCI是一个专有的API,需要Oracle专门的许可证,且目前OCI在Windows的支持不太好,因此建议在Linux或者Unix环境下使用OCI。
总结
以上两种方法都可以帮助我们从Oracle中获取有效的输出。ODBC驱动程序更加通用,而OCI API则更加专有且需要谨慎选择。根据实际情况进行选择和调整,可以取得更好的效果。