`

C++使用OTL访问操作数据库

OTL 
阅读更多

转自:http://www.cnblogs.com/skyme/archive/2010/11/08/1871509.html

源码及文档:http://otl.sourceforge.net/ 


什么是OTL:OTL 是 Oracle, Odbc and DB2-CLI TemplateLibrary 的缩写,是一个操控关系数据库的C++模板库,它目前几乎支持所有的当前各种主流数据库,如下表所示:

数据库

访问接口

支持版本

Oracle

OCI

OCI7、OCI8、OCI8i、OCI9i、OCI10g

DB2

CLI

DB2 CLI

MS SQL Server

、Sybase、Informix

、MySQL、 Interbase/Firebird、PostgreSQL、SQLite、SAP/DB、TimesTen、MS ACCESS

ODBC

ODBC2.5、ODBC3.x

 



Oracle和DB2也可以由OTL间接使用ODBC的方式来进行操纵。

OTL中直接操作Oracle主要是通过Oracle提供的OCI接口进行,依赖于Oracle客户端。

OTL使用简单, 只要头文件中包含有: #include “otlv4.h” 就可,实际上整个OTL就一个“.H”的文件,使用起来极为的方便。



优点

(1).跨平台

(2).运行效率高,与C语言直接调用数据库API相当

(3).开发效率高,使用方便,繁在其内,简在其外,比

    ADO.net使用起来更简单,更简洁

(4).部署容易,不需要ADO组件,不需要.net

    framework 等

缺点

(1).只能在C++中使用



OTL的主要类
主要类包括:otl_stream、otl_connect、otl_exception

•otl_stream类
    otl_stream类是OTL“流”的概念的具体表现形式,任何通过输入/输出参数使用SQL语句、PL/SQL 块或者是存储过程调用,在C++的编程中都能通过otl_stream类来实现。

        其构造函数为:

   (1)for Oracle 7/8/9/10:

   otl_stream(const int arr_size, // 流的缓存大小

                      const char* sqlstm, // SQL语句或PL/SQL块或存储过程                    

                      otl_connect& db, // OTL数据库连接对象

                       const char* ref_cur_placeholder=0, // 游标引用占位符名称  

                       const char* sqlstm_label=0 // SQL 语句标签);


(2)forODBC/DB2-CLI:

  otl_stream(const int arr_size,// 流的缓存大小

           constchar* sqlstm,// SQL语句或PL/SQL块或存储过程                   

           otl_connect& db,// OTL数据库连接对象

            const int implicit_select=otl_explicit_select ,

            const char* sqlstm_label=0//SQL 语句标签);

  OTL流构造函数,负责创建otl_stream对象并调用open()(解析sql语句)方法。

  otl_stream的性能主要被缓冲区大小arr_size一个参数控制。缓冲区大小定义了插入表的逻辑行以及与数据库一次往反交互(one round-trip to the database)过程中从表或视图中查询的逻辑行。

(3)void set_commit(int auto_commit=0);

  设置流的auto_commit标志。默认情况下,该标志被置1,即当输出缓冲区刷新时,当前的事务被自动提交。

  注意流的auto_commit标志和数据库的自动提交模型没有任何关系。

(4)void set_flush(const bool auto_flush=true);

  设置auto_flush标志。默认情况下auto_flush的值为true, 即如果缓冲区出现脏数据则在流的析构函数中刷新缓冲区。如果自动刷新标志被关闭,则需要使用close()方法或者flush()方法对流进行刷新。

  注意该函数仅仅能够设置流的析构函数中是否自动刷新,并不是通常意义上的缓冲区刷新。

(5)voidflush(void);

  刷新流的输出缓冲区。当输出缓冲区被填满时,缓冲区将被自动刷新。如果流的auto_commit标志被置上,则在刷新完毕后当前事务被提交。

•otl_connect类
otl_connect类封装了一系列有关数据库连接的功能:建立连接、断开连接、事务提交、事务回滚等等。换言之,otl_connect是在C++编程中创建和使用数据库连接以及进行数据库事务管理的类,主要方法有:

(1)static int otl_initialize(const int threaded_mode=0);

该静态方法的主要功能是初始化OTL数据库环境,程序中第一次建立与数据库的连接之前,必须调用该方法一次,其后再建立与数据库的连接,就不需要调用该方法了。如果程序是在多线程环境下访问数据库,参数threaded_mode需置为1。另外在多线程环境下访问数据库,不要多个线程操作同一个otl_connect对象,除非该ot_connect对象有互斥锁机制。



(2) otl_connect(const char* connect_str,const int auto_commit=0);

  连接数据库。参数同rlogon(),见(3)rlogon()

(3) void rlogon(const char* connect_str,const int auto_commit=0);

     该方法的主要功能是建立与数据库的连接。

     参数connect_str是数据库连接配置字符串,有两种表达形式

     o OTL4.0/OCIx

       ■”USER/PASSWORD”(本地数据库)

       ■”USER/PASSWORD@TNS_ALIAS”(远程数据库)

     o OTL4.0/ODBC和OTL4.0/DB2_CLI

       ■”USER/PASSWORD@DSN”

       ■”DSN=value;UID=value;PWD=value”

     参数auto_commit设置数据库事务的提交模式,auto_commit设置为1,表示数

据库事务自动提交;auto_commit设置为0,表示数据库事务非自动提交,auto_commit

缺省为0。

(4) void logoff(void);

  该方法的主要功能是断开与数据库的连接。

(5) void commit(void);

  该方法的主要功能是提交数据库事务。

(6) void rollback(void);

  该方法的主要功能是回滚数据库事务。

(7) void auto_commit_off(void); void auto_commit_on(void);

  设置otl_connect对象的auto_commit标志 

(8) long direct_exec(constchar *sqlstm,

  int ignore_error = otl_exception::enabled );

  直接执行静态(无绑定变量)的SQL语句 ,该函数返回处理的行数。-1:处理异常;>=0:在执行INSERT、DELETE或UPDATE语句时,实际返回的是已处理行数

•otl_exception类
       otl_exception类用于描述OTL操作数据时抛出的异常,有3个主要的成员变量:

       (1)unsignedchar msg[1000];

       该成员变量用于保存存异常的具体错误信息。

       (2)char stm_text[2048];

       该成员变量用于保存导致发生异常错误的SQL语句。

       (3)char var_info[256];

       该成员变量用于保存导致发生异常错误的输入/输出变量。

OTL使用起来也很简单,使用不同的数据库连接,主要是根据需要在程

序开始的宏定义来指定的。OTL是首先根据这个宏定义来初始化数据库

连接环境。OTL中用来区分连接方式的宏定义主要有下面这些:

OTL_ORA7,OTL_ORA8, OTL_ODBC, OTL_DB2_CLI, OTL_ODBC_MYSQL...

   不同的宏对应的数据库API,具体说明如下:

不同的宏对应的数据库API,具体说明如下:

宏定义名

说明

OTL_ORA7

for OCI7

OTL_ORA8

for OCI8

OTL_ORA8I

for OCI8i

OTL_ORA9I

for OCI9i. All code that compiles and works under #define OTL_ORA7, OTL_ORA8, and OTL_ORA8I, should work when OTL_ORA9I is used

OTL_ORA10G

for OCI10g. All code that compiles and works  under #define OTL_ORA7, OTL_ORA8, OTL_ORA8I, OTL_ORA9I, should work with OTL_ORA10G.

OTL_ORA10G_R2

for OCI10g, Release 2 (Oracle 10.2). All code that compiles and works  under #define OTL_ORA7, OTL_ORA8, OTL_ORA8I, OTL_ORA9I, and OTL_ORA10G should work with OTL_ORA10G_R2

OTL_DB2_CLI

for DB2 Call Level Interface (CLI)

OTL_INFORMIX_CLI

for Informix Call Level Interface for Unix (when  OTL_ODBC_UNIX is enabled).

OTL_IODBC_BSD

for ODBC on BSD Unix, when iODBC package is used

OTL_ODBC

for ODBC

OTL_ODBC_MYSQL

for MyODBC/MySQL. The difference between OTL_ODBC_MYSQL and OTL_ODBC is that transactional ODBC function calls are turned off for OTL_ODBC_MYSQL, since MySQL does not have transactions

OTL_ODBC_

POSTGRESQL

for the PostgreSQL ODBC driver 3.5 (and higher) that are connected to PostgerSQL 7.4 / 8.0  (and higher)  servers.

OTL_ODBC_UNIX

for ODBC bridges in Unix

OTL_ODBC_zOS

for ODBC on IBM zOS.

OTL_ODBC_XTG_IBASE6

for Interbase 6.x via XTG Systems'  ODBC driver. The reason for introducing this #define is that the ODBC driver is the only Open Source ODBC driver for Interbase. Other drivers, like Easysoft's ODBC for Interbase, are commercial products, and it beats the purpose of using Interbase, as an Open Source.database server.

 

 

绑定变量

•示例:
  INSERT INTO my_table (employee_id, supervisor_name)VALUES(

  :employee_id<int>,

  :supervisor_name<char[33]>)

•placeholder(比如employee_id)可以用没有意义的f1代替,但是在一个SQL语句中不能使用相同名字的placeholder
•在执行INSERT语句的时候,如果数据库中char字段的大小是n,则这个INSERT语句的绑定变量的大小要为n+1;否则当邦定变量的大小为n时,执行INSERT会出错。
•对数据库中定义的数字字段,可以根据字段的大小使用16位、32 位的整数和double类型;当然,如果对所有OCI的数字字段使用double,也不会出错。
•OTL的一般使用步骤包括:
(1)  使用宏指明底层数据库API类型和控制编译器对OTL的编译。例如:#define OTL_ORA9I      // Compile OTL 4.0/OCI9i

(2)  创建otl_connect对象,该对象一般为全局共享的。

(3)  调用otl_connect的静态方法otl_initialize()初始化OTL环境。

(4)  调用otl_connect的rlogon()方法连接数据库。

(5)  创建otl_stream()对象,该对象一般为局部的。

(6)  使用otl_stream的<<操作符绑定SQL中的变量。

(7)  使用otl_stream的>>操作符读取返回结果。

(8)  调用otl_connect的logoff()方法从数据库断开。





代码


•SQL使用举例(常量SQL使用):
   常量SQL就是不带任何绑定变量的SQL,OTL通过一个静态方法来操作:

   long otl_cursor::direct_exec(otl_connect&db,//OTL数据库对象

                                const char* sqltm,//SQL语句

                            otl_exception_disable=0,//OTL异常忽略标志

                           );

   返回值:

   ●-1,如果otl_exception_disable被设置成1,并且OTL的底层API发生错误

   ●>=0,SQL执行成功,返回实际处理成功的记录数.

   o Examples(Oracle)

代码


输出:

A=2,B=Test Stri ng1

A=3,B=Test String2

A=4,B=Test String3



常量PL/SQL块的使用与常量SQL的使用类似,在此不再赘述。









 

分享到:
评论

相关推荐

    C++使用OTL连接数据库.doc

    C++中的OTL(Oracle Template Library)是一个强大的模板库,专为C++开发者设计,用于高效地连接和操作各种主流数据库系统,包括Oracle、Sybase、MySQL、PostgreSQL、EnterpriseDB、SQLite、MS ACCESS以及Firebird等...

    C++ OTL 连接数据库 资料 以及源文件

    OTL(Object Transaction Library)是C++中一个用于数据库访问的开源库,它提供了一种高效、简洁的方式来处理SQL操作。这个压缩包“C++ OTL 连接数据库 资料 以及源文件”包含了关于如何使用OTL库来连接和操作数据库...

    C++中数据库操作开源库OTL4的介绍

    这个库提供了一种高效、简洁的方式来访问数据库,使得C++程序员可以方便地进行SQL查询、事务处理、结果集操作等。 OTL4的核心特性包括: 1. **模板编程**:OTL4基于C++模板技术,这使得它能够为不同的数据库类型...

    c++ otl 源码 例子

    这个压缩包包含了一系列的源码示例,展示了如何在C++项目中使用OTL进行数据库操作。 1. OTL简介: OTL是一个开源的C++模板库,它为开发者提供了与数据库进行低级交互的能力,同时保持了C++的高效性和面向对象的...

    C++OTL使用说明

    OTL不仅支持标准的SQL操作,还提供了异步I/O、事务处理、批处理等高级功能,极大地提升了C++数据库应用程序的性能和可维护性。 ### 1. 安装与配置 首先,你需要下载并安装OTL库。这通常包括获取源代码或者预编译的...

    c++开源连接数据库工具-OTL使用指南

    C++开源连接数据库工具OTL(Oracle Template Library)是一个强大的、高效的C++数据库访问库,它使得C++程序员能够方便地与多种数据库进行交互,包括但不限于Oracle、MySQL、SQL Server等。OTL提供了面向对象的接口...

    OTL跨平台数据库编程与应用

    ### OTL跨平台数据库编程与应用 #### 一、引言 OTL(Oracle, ODBC and DB2-CLI Template Library)是一个强大的跨...对于希望利用C++进行高效数据库编程的开发者来说,OTL无疑是一个值得深入学习和使用的优秀选择。

    otl4_htm.zip_c++ mysql_oracle c++接口_sql_数据库 封装_数据库接口

    OTL(Object Transaction Library)是一个强大的C++库,专门用于简化数据库访问,它提供了一种高效、简洁的方式来处理SQL查询和事务。OTL为开发者提供了与多种数据库系统交互的统一接口,包括MySQL、Oracle、SQL ...

    otl数据库.pdf

    OTL是一个用于数据库交互的C++库,它提供了一种相对简单的方式来访问和操作数据库中的数据。OTL支持多种数据库系统,包括Oracle、ODBC、DB2、MySQL、PostgreSQL、SQLite和SAP DB等。它通过模板来实现数据库操作,...

    OTL初级教程 C++访问ORACLE

    OTL(Oracle Template Library)是C++开发人员用于访问Oracle数据库的一个强大库,它提供了高效、灵活且易于使用的API,让开发者能够以面向对象的方式处理SQL语句和数据操作。本教程将深入介绍OTL的基本概念、核心...

    c++ otl 文档

    C++ OTL(Oracle Template Library)是一个用于C++开发的模板库,专门设计用来简化Oracle数据库和ODBC数据源的访问。OTL提供了一种高效且简洁的方式来执行SQL语句、存储过程,并处理数据库连接。它通过使用标准C++流...

    OTL访问Oracle的封装类

    综上所述,"OTL访问Oracle的封装类"是一个增强型的数据库访问解决方案,它整合了OTL库的优势,提供了数据库连接池、自动重连和连接超时管理等高级特性,极大地提升了C++应用访问Oracle数据库的效率和稳定性。...

    otl.zip_OTL_oracle_oracle OTL_sql server_数据库 otl

    9. **并发控制**:OTL支持多线程编程,可以在多线程环境中安全地访问数据库。 10. **易于集成**:OTL的API设计简洁,易于理解和使用,能够快速地与现有的C++项目整合。 OTL与Oracle数据库的结合,使得开发人员能够...

    otl官方示例代码

    OTL(Oracle Thin Library)是一个开源的C++数据库访问库,专为Oracle数据库设计,它提供了高效的接口,使得开发者能够方便地进行数据库操作。OTL不仅支持OCI(Oracle Call Interface),还支持ODBC(Open Database ...

    otl编程指南,Oracle等数据库的基本操作

    OTL(Oracle Template Library)是C++库,用于简化对Oracle数据库的访问,它提供了高效、灵活且方便的API,支持流式操作,使得数据库操作更像处理内存数据。本指南将详细介绍如何使用OTL进行Oracle数据库的基本编程...

    c++ otl 源码

    OTL(Open Transactional Library)是一个C++库,专门用于简化数据库访问,特别是对Oracle数据库的操作。OTL提供了一种高效、线程安全的方式来进行事务处理、错误处理和数据流操作。在本篇文章中,我们将深入探讨OTL...

    otl数据库资料.pdf

    OTL,全称为Oracle, Odbc and DB2-CLI Template Library,是一个强大的C++模板库,专门用于处理和操作各种关系型数据库系统。这个库旨在提供高效、便捷的数据访问方式,支持包括Oracle、DB2、MS SQL Server、Sybase...

    OTL编程技术详解

    OTL(Oracle Thin Library)是一种高效、轻量级的C++数据库访问库,主要用于与Oracle数据库进行交互。它提供了一种直接、快速且方便的方式来执行SQL语句和处理结果集,使得开发人员能够以更接近数据库原生的速度进行...

    C++数据库开发环境配置

    接下来,我们来看如何配置MySQL共享库,以实现通过OTL访问MySQL数据库。 1. **安装unixodbc** 使用以下命令安装unixodbc及其开发包: ```bash sudo aptitude install unixodbc-dev ``` 2. **安装libmyodbc** ...

    基于otl 4.0,OCI接口对oracle数据库的访问

    标题 "基于otl 4.0,OCI接口对oracle数据库的访问" 描述了一种使用OTL库(Oracle Template Library)版本4.0通过OCI(Oracle Call Interface)与Oracle数据库进行交互的方法。这篇博文可能详细介绍了如何配置和使用...

Global site tag (gtag.js) - Google Analytics