http://wenku.baidu.com/link?url=1uUiWbsB84Bqe4ct9rU1u9fNo8C4OeQPk-HC9c1DHJlnQ2Ns6uge6UTwqdxbIpzbUsMhETuyHfDBUKxtif_mhQ3wVgX1fml4lIl5auvTWvO

====== 
引言
====== 
在C++下连接Oracle的方式可以使用OCI。
OCI是甲骨文提供Oracle调用接口(Oracle Call Interface简称OCI)
,是Oracle数据库访问的基础接口。
OCI访问Oracle虽然效率很高,但OCI的API
非常复杂,一个简单的功能就需要编写相当多的代码。后来
Oracle为C++提供了一套新的OCCI(Oracle C++ Call Interface)
接口。该接口使用起来较为简单,但Oracle对其支持力度有限,且
occi库对编译器,编译器版本,数据库版本,crt版本,操作平台版本都有诸
多限制。因此,出现了一些封装oci但是是以类jdbc或者occi风格的wrapper
库,比如oraLib,ocilib,ocl。本文中使用的即是OCILIB。


 

1.  ocilib的使用

利用ocilib操作oracle数据库

1)   首先初始化

OCI_Initialize(err_handler, NULL, OCI_ENV_THREADED)

这里的第一个参数是异常错误处理函数。

2)   创建连接

定义OCI_Connection* m_pConntion并为m_pConntion赋值。

m_pConntion = OCI_ConnectionCreate(csServerDataBase, csServerUser, csServerPassWord, OCI_SESSION_DEFAULT)

这里的第一个参数是oracle数据库ip,端口及名字组成的字符串,172.7.14.6:1521/ORCL。第二个参数是用户名,第三个参数是密码。

3)   由已得的oci_connection*创建OCI_Statement*

m_stRow = OCI_StatementCreate(m_pConntion)。之后的SQL语句均与这个oci_statement*有关。

4)   对于返回记录集的SQL语句。

OCI_ExecuteStmt(m_stRow, csSQL)。

这里第一个参数就是OCI_Statement*

5)   对于没有记录集的操作,比如insert,可以使用上面的方法。Ocilib还提供了一种方式:bind方式。

对于这种方式,SQL语句也有一些小的变化,这里存在了占位的概念。比如这样的一个SQL语句:sqlInsert.Format("Insert into TableName(DeviceIndex,DrivewayNumber,DirectName,PlateInfo,PlateType,AlarmPlace,AlarmTime ,AlarmAction,VehicleSpeed,VehicleType,VehicleLen,VehicleColor,PlateColor,AlarmAdd,PicNum,PicFullView)values(:DeviceIndex,:DrivewayNumber,:DirectName,:PlateInfo,:PlateType,:AlarmPlace,:AlarmTime,:AlarmAction,:VehicleSpeed,:VehicleType,:VehicleLen,:VehicleColor,:PlateColor,:AlarmAdd,:PicNum,:PicfullView)"

这里的:DeviceIndex等都是随意起名字的,当然为了可读性,可以与字段起相同的名字,“:”一定要有的。

OCI_Prepare(m_stRow, sqlInsert.GetBuffer());这里的第一个参数仍然是oci_statement*。这句话也是必须的。之后就要将变量与字段名绑定在一起,比如:OCI_BindString(m_stRow, ":DeviceIndex", struAlarmTable.csDeviceIndex.GetBuffer(), 0);第二个参数就是前面SQL语句中占位变量的名字,第三个参数是要绑定到字段的具体的变量。可以绑定的类型由很多的。在每个字段都完成绑定后调用OCI_Execute(m_stRow),然后再调用OCI_Commit(m_pConntion),这样就完成了插入语句。当然这仅仅是插入一条数据,如果要进行批量绑定并插入,这里不做说明。

6)   退出时要记得释放资源

OCI_StatementFree(m_stRow)

OCI_ConnectionFree(m_pConntion);