OCI学习笔记(一)

因项目,对数据库性能要求比较高,公司一向采用数据库的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下,找开一看你就明白了,

配置方式很简单,不多说了。

ContractedBlock.gif ExpandedBlockStart.gif 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;
}

 

2.ODBC

 

ContractedBlock.gifExpandedBlockStart.gif

ContractedBlock.gif ExpandedBlockStart.gif 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;
}

Code

很像吧,所以理解OCI,并没有想像中的那么难.天下程序皆出一家.

转载于:https://www.cnblogs.com/anran_guojianjun/archive/2009/06/17/1505405.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值