OTL mySQL
C++使用OTL与mySql交互
OTL 一般概念
- 当OTL用于oracle数据库时可以通过oracle数据库提供的接口;当OTL用于非oracle数据库时,OTL提供了odbc接口(oracle数据库也提供),所以使用OTL来控制非oracle数据库均需先安装对应数据库的odbc驱动。
- 因为对于不同的数据库OTL使用不同的odbc,所以在使用OTL之前需要定义一些宏,告知OTL当前使用的数据库类型。
使用OTL操作mysql
#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))。
* 其他