OTL mySQL

C++使用OTL与mySql交互

OTL 一般概念

  • 当OTL用于oracle数据库时可以通过oracle数据库提供的接口;当OTL用于非oracle数据库时,OTL提供了odbc接口(oracle数据库也提供),所以使用OTL来控制非oracle数据库均需先安装对应数据库的odbc驱动。
  • 因为对于不同的数据库OTL使用不同的odbc,所以在使用OTL之前需要定义一些宏,告知OTL当前使用的数据库类型。

使用OTL操作mysql

  • 在使用OTL前需要安装myodbc。如果使用5.1及以上版本的myodbc,需要配置mySql使其默认编码方式为utf-8。参考1参考2
  • 在引用otlv4.h头文件之前要先定义几个宏(参考):
#define OTL_ODBC // Compile OTL 4.0/ODBC
// The following #define is required with MyODBC 5.1 and higher
#define OTL_ODBC_SELECT_STM_EXECUTE_BEFORE_DESCRIBE
#define OTL_UNICODE // Compile OTL with Unicode 
  • 编译OTL时添加链接库:win32: LIBS+=-lodbc32,为了在尽可能的减少依赖,在发布软件时,使用静态的链接选项(以Qt为例):QMAKE_LFLAGS+=-static

使用

  • OTL的使用流程
    * 首先定义宏,指明所使用的数据库类型并设置环境。如#define OTL_ORA9I
    * 定义otl_connect对象。otl_connect db; // connect object
    * 使用otl_connect的静态方法otl_initialize()初始化OTL环境。otl_connect::otl_initialize();
    * 使用otl_connect的rlogon()方法连接数据库。db.rlogon("user_id/password@odbc_data_source_name");
    * 定义otl_stream()对象。如下示例中所示
    * 使用otl_stream的<<操作符绑定SQL中的变量(参考下面示例)。当所以变量均绑定之后,otl_stream会自动执行应sql语句
    * 使用otl_stream的>>操作符读取返回结果
    * 调用otl_connect的logoff()方法从数据库断开

  • 示例(仅作为参考,具体例子参考官方资料

//use #define OTL_UNICODE
try {
//insert
    otl_stream insert_data(
        1,// buffer size should be == 1 always on INSERT.
        "insert into t_belt_realtime_data(velocity, cumulation, datetime, belt_id, logs )"
        "values(:velocity<float>,:cumulation<float>,:datetime<unsigned>,:belt_id<short>, :logs<char[51]>)",
// SQL statement, char[5] means 5 2-byte. Unicode charatcters including a null terminator
        db_  // connect object
    );
//每次填充一个数据,从左到右,当前的例子一共需要填充5次数据
    insert_data<<static_cast<float>(data.first);//std::pair<double,double> data; 将数据转化为与sql语句中对应占位符相同的类型
    insert_data<<static_cast<float>(data.second);
    insert_data<<static_cast<unsigned>(time(nullptr));
    insert_data<<static_cast<short>(0);
 
    unsigned short tmp[32]; // Null terminated Unicode character array.
    tmp[0]=1111; // Unicode character (decimal code of 1111)
    tmp[4]=0; // Unicode null terminator
    insert_data<<(unsigned char*)tmp;  //当所有占位符都填充完毕后,otl_stream会自动执行对应的sql语句
 
//select
    char str_sql[] = "select velocity, cumulation   fromt_belt_realtime_data  "//注意sql语句中的空格
                     " WHERE datetime >= :time_tem<unsigned>" ;
    otl_stream select_data(
        1,//指定缓冲行数,OTL中应该还有一层隐藏的缓冲区,这里指定的缓冲区只是指定每次OTL填充的行数。
        (const char*)str_sql,
        db_ );
    select_data<<static_cast<unsigned>(0);
    float v,c;
    while(!select_data.eof()) { //显示所有数据,虽然说缓冲区只设定为1
//执行str_sql之后返回的数据的行数可能大于1,但OTL会将他们保存在其默认缓冲区中。
//只有select_data中所有有效行都迭代完成之后eof才会置true。
        select>>v>>c;
        cout<<v<<" "<<c<<endl;
    }
} catch(otl_exception& p) {
    cerr<<p.msg<<endl; // print out error message
    cerr<<p.stm_text<<endl; // print out SQL that caused the error
    cerr<<p.var_info<<endl; // print out the variable that caused the error
}
  • 占位符:示例第一句语句中由冒号开头的变量为占位符参数,我们需要使用<<填充这些变量,冒号后为数据库表中字段名,尖括号中为字段的数据类型:
    * float:4-byte floating point number
    * int:signed 32-bit int
    * short:short int (16-bit signed integer)
    * unsigned:unsigned int (32-bit unsigned integer)
    * char[length]:由NUL结尾的字符串,最大长度依赖于数据库(length参数是必须的,length表示的是字符个数且length中包含了NUL)。如果定义了宏OTL_UNICODE,那么字符串的编码方式为UTF-16(每个字符两字节),且依旧使用NUL结尾。(char[11]可以用于绑定varchar(9))。
    * 其他
posted @ 2016-07-17 16:31  jiahu  阅读(1262)  评论(0编辑  收藏  举报