zoukankan      html  css  js  c++  java
  • 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))。
      * 其他
  • 相关阅读:
    鸿合爱学班班.kl课件转ppt课件
    Mac下Android Studio添加忽略文件的方法
    Android中处理PPI
    Mac下配置全局gradlew命令
    Application启动图
    图像合成模式XferMode
    path绘制
    drawArc 画扇形 画弧线
    okhttp请求完整流程图
    责任链模式
  • 原文地址:https://www.cnblogs.com/jiahu-Blog/p/5678856.html
Copyright © 2011-2022 走看看