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的<
* 使用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,:cumulation,:datetime,:belt_id, :logs)",
// SQL statement, char[5] means 5 2-byte. Unicode charatcters including a null terminator
db_ // connect object
);
//每次填充一个数据,从左到右,当前的例子一共需要填充5次数据
insert_data<(data.first);//std::pair data; 将数据转化为与sql语句中对应占位符相同的类型
insert_data<(data.second);
insert_data<(time(nullptr));
insert_data<(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<
//select
char str_sql[] = "select velocity, cumulation fromt_belt_realtime_data "//注意sql语句中的空格
" WHERE datetime >= :time_tem" ;
otl_stream select_data(
1,//指定缓冲行数,OTL中应该还有一层隐藏的缓冲区,这里指定的缓冲区只是指定每次OTL填充的行数。
(const char*)str_sql,
db_ );
select_data<(0);
float v,c;
while(!select_data.eof()) { //显示所有数据,虽然说缓冲区只设定为1
//执行str_sql之后返回的数据的行数可能大于1,但OTL会将他们保存在其默认缓冲区中。
//只有select_data中所有有效行都迭代完成之后eof才会置true。
select>>v>>c;
cout<
}
} catch(otl_exception& p) {
cerr<
cerr<
cerr<
}
占位符:示例第一句语句中由冒号开头的变量为占位符参数,我们需要使用<
* 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))。
* 其他