1. OTL 编程简介
1.1. 功能
OTL是Oracle 和 ODBC 的模板库,它屏蔽数据库操作的底层,提供数据库连接功能,以标准 C++ 流的方式完成嵌入式 SQL 语句、存储过程的执行和光标操作。
1.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 int auto_commit=0); // connect_str的格式:USER/PASSWORD@TNS_ALIAS,如果是本地连接则不需要TNS_ALIAS
void rlogon(const char* connect_str,const int auto_commit=0);
void logoff();
void server_attach(const char* tnsname=0); // OTL/OCI8 only
void server_detach();// OTL/OCI8 only
session_begin(const char* username, const char* password, const int auto_commit=0);// OTL/OCI8 only
void session_end();// OTL/OCI8 only
void session_reopen(const int auto_commit=0)// OTL/OCI8 only,打开用 session_end 关闭的会话
void commit();
void rollback();
注释:使用 serversession来登录比用 rlogon 效率更高
建议使用显式的 commit rollback,不使用 autocommit
1.3. otl_stream 类
1.3.1. 概述
以宿主调用和流的方式完成 SQL 语句的执行。
工作原理:先分析程序员指定的 SQL 语句,之后以流的方式把数据和 otl_stream 内部的缓冲区作交换,通过 flush() 将数据刷新到数据库中。
otl_nocommit_stream
1.3.2. 主要成员函数
otl_stream(
const short arr_size,
const char* sqlstm,
otl_connect& db,
const char* ref_cur_placeholder=0)
)
构造函数
arr_size表示缓冲记录的条数
sqlstm 表示要执行的 SQL 语句
db 表示使用的数据库连接嵌入式多线程编程
ref_cur_placeholder 表示返回的光标(如果有的话)的名字
void open(
const short arr_size,
const char* sqlstm,
otl_connect& db,
const char* ref_cur_placeholder=0)
)
同上
void close()
关闭流
int good()
测试流是否已经成功打开
int eof()
是否到了流的结尾,和标准 C++ 流的 eof 相同
void flush()
刷新 otl_stream 的缓冲区(获取新的数据或者把数据写到数据库中);当缓冲区满的时候,otl_stream 会自动 flush;如果设置了自动提交,则在 flush 的时候将会触发提交
void clean(const int clean_up_error_flag=0)
清空缓冲区而不执行刷新操作
int is_null()
测试通过 >> 运算符获取的值是否为空
long get_rpc()
获取处理了的记录数目,限于INSERTDELETEUPDATE语句
otl_column_desc* describe_select(int& desc_len);
获取字段描述信息,适用于SELECT语句、引用光标(OCI)和存储过程(ODBC for MS SQL Server and Sybase
class otl_column_desc{
public:
char name[512]; // column name
int dbtype; // database dependent, column datatype code.
int otl_var_dbtype; // OTL defined, column datatype code
int dbsize; // column length
int scale; // for numeric columns, column scale
int prec; // for numeric columns, column precision
int nullok; // indicator whether column is nullable or not
};
void set_commit(
int auto_commit=0
)
刷新(flush)缓冲区的时候,是否自动提交事务。从更易于理解的角度,建议在显式提交的应用中用 otl_nocommit_stream
1.3.3. OTL 的数据类型
otl_var_char
null terminated string (code=1)
otl_var_double
8 byte floating point number (code=2)
otl_var_float
4 byte floating point number (code=3)
otl_var_int
32 bit signed integer (code=4)
otl_var_unsigned_int
32 bit unsigned integer (code=5)
otl_var_short
16 bit signed integer (code=6)
otl_var_long_int
32 signed integer 9code=7)
otl_var_timestamp
datatype that is mapped into TIMESTAMP_STRUCT, ODBC only (code=8)
otl_var_varchar_long
datatype that is mapped into LONG in Oracle 7/8, TEXT in MS SQL Server and Sybase (code=9)
otl_var_raw_long
datatype that is mapped into LONG RAW in Oracle 7/8, IMAGE in MS SQL Server ad Sybase (code=10)
otl_var_clob
datatype that is mapped into CLOB in Oracle 8 (code=11)
otl_var_blob
datatype that is mapped into BLOB in Oracle 8 (code=12)
1.3.4. 示例
    otl_stream& operator>>(char& c);
    otl_stream& operator>>(unsigned char& c);
    otl_stream& operator>>(char* s);
    otl_stream& operator>>(unsigned char* s);
    otl_stream& operator>>(int& n);
    otl_stream& operator>>(unsigned& u);
    otl_stream& operator>>(short& sh);
    otl_stream& operator>>(long int& l);
    otl_stream& operator>>(float& f);
    otl_stream& operator>>(double& d);
    otl_stream& operator>>(otl_long_string& s);
                      // read the LOB from the stream
    otl_stream& operator>>(TIMESTAMP_STRUCT& s);
                      // read the timestamp from the stream
                      // (OTL 3.1/ODBC only)
    otl_stream& operator>>(otl_datetime& dt);
            // read date/time info from the stream
    otl_stream& operator>>(otl_XXX_tab<…>& tab);
            // read PL/SQL tables from the stream (OCIx)
   
    otl_stream& operator>>(otl_lob_stream& lob);
                  // read reference to CLOB/BLOB from otl_stream
                  // into otl_lob_stream (OCI8). In other words,
                  // initialize otl_lob_stream for reading CLOB/BLOB
                  // in stream mode
   
    otl_stream& operator<<(const char c);
    otl_stream& operator<<(const unsigned char c);
    otl_stream& operator<<(const char* s);
    otl_stream& operator<<(const unsigned char* s);
    otl_stream& operator<<(const int n);
    otl_stream& operator<<(const unsigned u);
    otl_stream& operator<<(const short sh);
    otl_stream& operator<<(const long int l);
    otl_stream& operator<<(const float f);
    otl_stream& operator<<(const double d);
    otl_stream& operator<<(const otl_null n); // write NULL into the stream
    otl_stream& operator<<(const otl_long_string& d);
                      // write the LOB into the stream
    otl_stream& operator<<(const TIMESTAMP_STRUCT& d);
                      // write the timestamp into the stream
                      // (OTL 3.1/ODBC only)
    otl_stream& operator<<(const otl_datetime& dt);
                      // write date/time info into the stream
    otl_stream& operator<<(const otl_XXX_tab& tab);
                      // write PL/SQL tables into the stream (OCIx)
otl_stream& operator<<(otl_lob_stream& lob);
              // write otl_lob_stream descriptor intoto otl_stream (OCI8).
              // In other words, initialize otl_lob_stream
              // for writing CLOB/BLOB in stream mode.
   

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。