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();
✧ 注释:使用 server、session来登录比用 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() | 获取处理了的记录数目,限于INSERT、DELETE、UPDATE语句 |
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小时内删除。
发表评论