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则更加专有且需要谨慎选择。根据实际情况进行选择和调整,可以取得更好的效果。


数据运维技术 » C语言编程从Oracle中取得有效输出(c 获取oracle输出)