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。
m_stRow = OCI_StatementCreate(m_pConntion)。之后的SQL语句均与这个oci_statement*有关。
4) 对于返回记录集的SQL语句。
OCI_ExecuteStmt(m_stRow, csSQL)。
这里第一个参数就是OCI_Statement* 的对象,也就是之前有oci_connection*所创建的。第二个参数就是要执行的SQL语句。如果要获取记录集,首先要定义一个记录集指针OCI_Resultset* rsRow,然后调用rsRow = OCI_GetResultset(m_stRow),这里的参数仍然是OCI_Statement* 基本上要执行SQL语句都会用到这个。然后可以调用OCI_FetchNext(rsRow)来获取记录集中下一个记录,如果配合while循环就可以遍历记录集。对于回去每一条记录的每个字段,要使用OCI_Get***,这里的***就是数据类型,常用的由OCI_GetInt,OCI_GetString,GetLob,OCI_GetDate OCI_GetTimestamp等等。
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);