OTL 编程简介
1. OTL简介
OTL是Oracle 和 ODBC 的模板库,它屏蔽数据库操作的底层,提供数据库连接功能,以标准 C++ 流的方式完成嵌入式 SQL 语句、存储过程的执行和光标操作。
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库,例如Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。OTL中直接操作Oracle主要是通过Oracle提供的OCI接口进行,进行操作DB2数据库则是通过CLI接口来进行,至于MS的数据库和其它一些数据库,则OTL只提供了ODBC来操作的方式。当然Oracle和DB2也可以由OTL间接使用ODBC的方式来进行操纵。
在MS Windows and Unix 平台下,OTL目前支持的数据库版本主要有:Oracle 7 (直接使用 OCI7), Oracle 8 (直接使用 OCI8), Oracle 8i (直接使用OCI8i), Oracle 9i (直接使用OCI9i), Oracle 10g (直接使用OCI10g), DB2 (直接使用DB2 CLI), ODBC 3.x ,ODBC 2.5。OTL最新版本为4.0,参见http://otl.sourceforge.net/,下载地址http://otl.sourceforge.net/otlv4_h.zip。
优点:
a) 跨平台
b) 运行效率高,与C语言直接调用API相当
c) 开发效率高,起码比ADO.net使用起来更简单,更简洁
d) 部署容易,不需要ADO组件,不需要.net framework 等。
2. otl_connect 类
提供数据库连接、事务操作的功能。 (SHBOSS开发中,由 CDBConnGuard 类屏蔽之并进行连接等管理。)
主要成员函数:
² int connected; // 是否已经连接到数据库
² static int otl_initialize(const int threaded_mode=0); // 初始化 OTL 环境,必须在调用 OTL API 之前被调用;threaded_mode=1表示运行在多线程环境
² void set_max_long_size(const int amax_size); // 设置缓冲区大小(仅对大数据字段适用)
² otl_connect(const char* connect_str,const intauto_commit=0); // connect_str的格式:USER/PASSWORD@TNS_ALIAS,如果是本地连接则不需要TNS_ALIAS
² void rlogon(const char* connect_str,const int auto_commit=0);
² void logoff();
² void commit();
² void rollback();
² 注释:使用 server、session来登录比用 rlogon 效率更高
² 建议使用显式的 commit 和 rollback,不使用 autocommit
3. otl_stream 类
以宿主调用和流的方式完成 SQL 语句的执行。
工作原理:先分析程序员指定的 SQL 语句,之后以流的方式把数据和 otl_stream 内部的缓冲区作交换,通过 flush() 将数据刷新到数据库中。
otl_nocommit_stream
主要成员函数:
OTL 的数据类型
4. 错误处理(otl_exception)
class otl_exception {
public:
char stm_text[2048]; // 导致异常的SQL 语句
char var_info[256]; // 导致数据类型不兼容的邦定变量的名字
unsigned char msg[1000]; // 数据库或者OTL的错误信息
int code; // 错误代码
};
5. 其它
5.1 使用邦定变量
示例:
INSERT INTO my_table VALUES( :employee_id<int>,
:supervisor_name<char[32]>)
5.2 char 字段
在执行INSERT语句的时候,如果数据库中char字段的大小是n,则这个INSERT语句的邦定变量的大小要为n+1;否则当邦定变量的大小为n时,执行INSERT会出错。
例如:
INSERT INTO my_table VALUES( :1<int>,:2<char[33]>, :3<double>,:4<char[129]> )
这个例子中,my_table的第二和第四个字段的大小分别为32和128。
5.3 number 字段
对数据库中定义的数字字段,可以根据字段的大小使用16位、32 位的整数和double类型;当然,如果对所有OCI的数字字段使用double,也不会出错。
5.4 otl_datetime
class otl_datetime{
public:
int year;
int months;
int day;
int hour;
int minute;
int second;
};
5.5 otl_null
otl_null表示一个空值,当要INSERT一个空值到数据库中时,必须使用它。
class otl_null{
public:
otl_null(){}
~otl_null(){}
};