因项目,对数据库性能要求比较高,公司一向采用数据库的API进行数据存储。对于ORACLE平台,有OOCI与OCI可以选择,前都经过的ORACLE公司的C++封装,比较容易便用。后者是C接口,用起来相对复杂些。因为公司已前用在MYSQL上的是
用C写的。为了降低对源程序的更改量,最后选择了OCI。网上关于OCI的资料比较少,庆幸的是ORACLE官网上提供了十分详细的OCI接口文档。虽然是英文的,但是作都写得还是很浅显易懂的。随读之。意外发现它与ODBC方式的数据库访问非常相似.也许这并不是偶然。
代码为证:这些代码在VS2008测试通过,去除了错误处理程序.
1.OCI
在VS上开发OCI程序需要ORALE的include文件与LIB文件。这个都在ORACLE_HOME/oci下,找开一看你就明白了,
配置方式很简单,不多说了。
Code
#include "stdafx.h"
#include <oci.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"oci.lib")
int _tmain(int argc, _TCHAR* argv[])
{
char *user="anran";
char *password="anran";
char *dbName="firstdb";
char *insertStmt = "insert into test(id,name) values(1,'anrna')";
sword err;
OCIEnv *envhpp;
OCIError *errhpp;
OCISvcCtx *svcCtx;
OCIStmt *stmt;
//创建环境句柄
err = OCIEnvCreate(&envhpp,OCI_OBJECT,(dvoid*)0,(dvoid*(*)(dvoid*,size_t))0,(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **) 0 );
//创建错误句柄
err = OCIHandleAlloc(envhpp,(void**)&errhpp,OCI_HTYPE_ERROR,(size_t)0,(void**)0);
//登陆服务器
err = OCILogon(envhpp,errhpp,&svcCtx,(const OraText*)user,(ub4)strlen(user),(const OraText*)password,(ub4)strlen(password),
(const OraText*)dbName,(ub4)strlen(dbName));
//创建DML/DDL句柄
err = OCIHandleAlloc(envhpp,(void**)&stmt,OCI_HTYPE_STMT,(size_t)0,(void**)0);
//准备SQL语句
err = OCIStmtPrepare(stmt,errhpp,(const OraText*)insertStmt,(ub4)strlen(insertStmt),OCI_NTV_SYNTAX,(ub4)OCI_DEFAULT);
//执行SQL语句
err = OCIStmtExecute(svcCtx,stmt,errhpp,(ub4)1,(ub4)0,(OCISnapshot*)0,(OCISnapshot*)0,OCI_DEFAULT);
//提交当前事
err = OCITransCommit(svcCtx,errhpp,0);
return 0;
}
#include "stdafx.h"
#include <oci.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"oci.lib")
int _tmain(int argc, _TCHAR* argv[])
{
char *user="anran";
char *password="anran";
char *dbName="firstdb";
char *insertStmt = "insert into test(id,name) values(1,'anrna')";
sword err;
OCIEnv *envhpp;
OCIError *errhpp;
OCISvcCtx *svcCtx;
OCIStmt *stmt;
//创建环境句柄
err = OCIEnvCreate(&envhpp,OCI_OBJECT,(dvoid*)0,(dvoid*(*)(dvoid*,size_t))0,(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **) 0 );
//创建错误句柄
err = OCIHandleAlloc(envhpp,(void**)&errhpp,OCI_HTYPE_ERROR,(size_t)0,(void**)0);
//登陆服务器
err = OCILogon(envhpp,errhpp,&svcCtx,(const OraText*)user,(ub4)strlen(user),(const OraText*)password,(ub4)strlen(password),
(const OraText*)dbName,(ub4)strlen(dbName));
//创建DML/DDL句柄
err = OCIHandleAlloc(envhpp,(void**)&stmt,OCI_HTYPE_STMT,(size_t)0,(void**)0);
//准备SQL语句
err = OCIStmtPrepare(stmt,errhpp,(const OraText*)insertStmt,(ub4)strlen(insertStmt),OCI_NTV_SYNTAX,(ub4)OCI_DEFAULT);
//执行SQL语句
err = OCIStmtExecute(svcCtx,stmt,errhpp,(ub4)1,(ub4)0,(OCISnapshot*)0,(OCISnapshot*)0,OCI_DEFAULT);
//提交当前事
err = OCITransCommit(svcCtx,errhpp,0);
return 0;
}
2.ODBC
Code
#include "stdafx.h"
#include <Windows.h>
#include <sql.h>
#include <sqlext.h>
#include <Odbcinst.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
SQLHENV envhle;
SQLHDBC dbchle;
SQLHSTMT stmehle;
WCHAR *pDsn= L"firstDb";
WCHAR *pUser = L"anran";
WCHAR *pPwd = L"anran";
WCHAR *insertStmt = L"insert into test(id,name) values(2,'anran')";
//环境句柄[与上同]
SQLRETURN sqlRet = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&envhle);
sqlRet = SQLSetEnvAttr(envhle, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3,0);
//sqlRet = SQLSetEnvAttr(envhle,SQL_ATTR_CONNECTION_TIMEOUT,(void*)1000,0);
//sqlRet = SQLSetEnvAttr(envhle,SQL_ATTR_LOGIN_TIMEOUT,(void*)SQL_LOGIN_TIMEOUT_DEFAULT,0);
//连接句柄[与上同]
sqlRet = SQLAllocHandle(SQL_HANDLE_DBC,envhle,&dbchle);
sqlRet = SQLConnect(dbchle,(SQLWCHAR*)pDsn,wcslen(pDsn),(SQLWCHAR*)pUser,
wcslen(pUser),(SQLWCHAR*)pPwd,wcslen(pPwd));
//SQL执行句柄
sqlRet = SQLAllocHandle(SQL_HANDLE_STMT,dbchle,&stmehle);
//迅速执行
sqlRet = SQLExecDirect(stmehle,(SQLWCHAR*)insertStmt,wcslen(insertStmt));
return 0;
}
#include "stdafx.h"
#include <Windows.h>
#include <sql.h>
#include <sqlext.h>
#include <Odbcinst.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
SQLHENV envhle;
SQLHDBC dbchle;
SQLHSTMT stmehle;
WCHAR *pDsn= L"firstDb";
WCHAR *pUser = L"anran";
WCHAR *pPwd = L"anran";
WCHAR *insertStmt = L"insert into test(id,name) values(2,'anran')";
//环境句柄[与上同]
SQLRETURN sqlRet = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&envhle);
sqlRet = SQLSetEnvAttr(envhle, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3,0);
//sqlRet = SQLSetEnvAttr(envhle,SQL_ATTR_CONNECTION_TIMEOUT,(void*)1000,0);
//sqlRet = SQLSetEnvAttr(envhle,SQL_ATTR_LOGIN_TIMEOUT,(void*)SQL_LOGIN_TIMEOUT_DEFAULT,0);
//连接句柄[与上同]
sqlRet = SQLAllocHandle(SQL_HANDLE_DBC,envhle,&dbchle);
sqlRet = SQLConnect(dbchle,(SQLWCHAR*)pDsn,wcslen(pDsn),(SQLWCHAR*)pUser,
wcslen(pUser),(SQLWCHAR*)pPwd,wcslen(pPwd));
//SQL执行句柄
sqlRet = SQLAllocHandle(SQL_HANDLE_STMT,dbchle,&stmehle);
//迅速执行
sqlRet = SQLExecDirect(stmehle,(SQLWCHAR*)insertStmt,wcslen(insertStmt));
return 0;
}
Code
很像吧,所以理解OCI,并没有想像中的那么难.天下程序皆出一家.