Windows环境下
安装MySQL
参考菜鸟教程:MySQL 安装 | 菜鸟教程
安装的时候,记得密码等级设置为low,如果使用增强密码等级,会导致连不上。假如你设置root密码为123456的话。
此时默认MySQL只支持localhost访问
安装ODBC
mysql-connector-odbc-5.3.4-winx64.msi
链接:https://pan.baidu.com/s/1fAyolhF-mxOD2mpAz2ls_Q
提取码:1234
注意这是64位的ODBC,所以你的Windows C++代码也要编译为x64位的才可以访问
创建ODBC数据源
https://jingyan.baidu.com/article/8065f87f38b31423312498e4.html
安装Navicat
百度网盘下载:链接:https://pan.baidu.com/s/19sjjirbY9XN4R0DKgm6p5Q
提取码:1234
安装好了,使用localhost连接MySQL,创建一个新的名称为test的测试数据库。
允许数据库使用IP访问
使用Navicat访问mysql这个核心数据库(包含访问控制),新建查询:
输入 use mysql; select user,host from user;我们的目的是要把localhost用%代替即可。
使用
update user set host='%' where host='localhost';
flush privileges;
更新即可,修改后效果如下:
使用IP访问可以了:
创建表
运行脚本创建空表 e_eledata.sql
编译运行程序
选择x64 debug模式,执行程序:
Linux下
安装MySQL Linux C SDK
sudo apt-get install libmysqlclient-dev
安装Linux ODBC
sudo apt-get install unixodbc-dev
配置ODBC
安装mysql的odbc驱动
官网下载驱动:
MySQL :: Download Connector/ODBC
mysql-connector-odbc-8.0.27-linux-glibc2.12-x86-64bit.tar.gz
或者百度云下载:链接:https://pan.baidu.com/s/1f0l5ApAnQneByQNrxYVmQw
提取码:1234
解压到用户目录:tar -xvf mysql-connector-odbc-8.0.27-linux-glibc2.12-x86-64bit.tar.gz
拷贝文件:
sudo cp ~/mysql-connector-odbc-8.0.27-linux-glibc2.12-x86-64bit/lib/libmyodbc8a.so ./
配置odbc
create /etc/odbcinst.ini
sudo touch odbcinst.ini
sudo vi odbcinst.ini
libmyodbc5a.so (for ANSI system) and libmyodbc5w.so (for Unicode).
[MySQL]
Driver=/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8a.so
UsageCount=1
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage = 1
设置so文件可以被访问:
sudo vi /etc/ld.so.conf
在文件末尾增加so文件的路径:
include /etc/ld.so.conf.d/*.conf
/usr/lib/x86_64-linux-gnu/odbc/
执行命令使之生效:sudo ldconfig
and /etc/odbc.ini
sudo vi odbc.ini
[mysql]
Driver=MySQL
SERVER=192.168.0.101
UID=root
PWD=123456
DATABASE=test
NO_SCHEMA=1
编译运行
make
./main
本资源付费使用。
1 增加了对Windows MFC程序的支持
2 支持VS2010-VS2015
Windows每秒钟10000条以上插入;Linux每秒插入5000条以上。
使用方法:
1 复杂的多表连接条件语句直接拼接SQL语句字符串就行了。
2 Windows下跨数据库使用ODBC数据源即可。
![](https://i-blog.csdnimg.cn/blog_migrate/017b15ecb067d2005d2bed6358110421.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0960c41109648d3ced27172f50378266.png)
测试代码
int main(int, char *[])
{
vector<e_eledata> arr_data;
print("begin make_data");
make_data(arr_data);
print("begin insert 3000 data");
try
{
Otlv4_Handle otl_handler;
otl_handler.logon("root/123456@mysql_from_centos");
otl_handler.insert(e_eledata::insert_sql(),arr_data);
print("insert data end ");
arr_data.clear();
otl_handler.select(e_eledata::select_sql(),arr_data);
print("select top 10:");
for (int i=0;i<arr_data.size();++i)
{
cout<<arr_data[i].to_string()<<endl;
}
}
catch(otl_exception& ex)
{
cout<<"exception:\n"
<<"msg:"<<ex.msg<<"\n"
<<"text:"<<ex.stm_text<<"\n"
<<"info:"<<ex.var_info<<"\n";
}
return 0;
};
使用:
版本2.0简单封装OTL
头文件Otlv4_Handle.h
#ifndef OTLV4_HANDLE_H
#define OTLV4_HANDLE_H
// =================================================================================
// ORACLE, ODBC and DB2/CLI Template Library, Version 4.0.262,
// Copyright (C) 1996-2012, Sergei Kuchin (skuchin@gmail.com)
// modified by carea @ 2014-10-29 Version 1.0
// =================================================================================
/************************************************************************/
/* */
/* 邦定变量类型 | C++ 程序使用的对应类型 */
/* USED IN MySQL table | USED IN C++ STRUCT MEMBER TYPE */
/* int | long long */
/* timestamp | otl_datetime */
/* varchar | std::string */
/* bigint | long long */
/* decimal | double */
/* */
/************************************************************************/
//数据类型应该支持的输入输出操作
//otl_stream& operator>>(otl_stream& in ,T& t)
//otl_stream& operator<<(otl_stream& out ,const T& t)
/*********************************************************************************/
/* */
/* 常用SQL语句写法 */
/*otl_handle.select("select f2 from test_tab",arr); */
/*otl_handle.insert("insert into test_tab1(f2)values(:f2<char[30]> )",arr); */
/* */
/*说明:数据库表中如果有属性名为:IP、PORT、INTERVAL这种字段,赶紧改名!!(与关键字冲突) */
/* */
/*********************************************************************************/
#ifdef OTLV4_HANDLE_WINDOWS
#define OTL_ODBC_MSSQL_2008
#define OTL_ODBC_SELECT_STM_EXECUTE_BEFORE_DESCRIBE
#define OTL_STL//using std::string
#define OTL_ANSI_CPP // Turn on ANSI C++ typecasts
#define OTL_BIGINT long long
#define OTL_STR_TO_BIGINT(str,n) { n=_atoi64(str); }
#define OTL_BIGINT_TO_STR(n,str) { _i64toa(n,str,10); }
#define INSERT_NUM 10000
#endif
#ifdef OTLV4_HANDLE_LINUX
#define OTL_ODBC_UNIX
#define OTL_ODBC_SELECT_STM_EXECUTE_BEFORE_DESCRIBE
//#define OTL_ODBC_MYSQL
#define OTL_STL//using std::string
#define OTL_ANSI_CPP // Turn on ANSI C++ typecasts
#define OTL_BIGINT long long
#define OTL_STR_TO_BIGINT(str,n) { n=atoll(str); }
#define OTL_BIGINT_TO_STR(n,str) { sprintf(str,"%lld", n);}
#define INSERT_NUM 1
#endif
#include "otlv4.h"// include the OTL 4.0 header file
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
#ifndef SCP_EXPORT_H
#include "SCP_Export.h"
#endif
class SCP_Export Otlv4_Handle
{
public:
Otlv4_Handle();
bool logon(const string& db_info);
bool reconnect_to_db_once(void);
~Otlv4_Handle(void);
template<typename T> int insert(const string& sql,const vector<T>& data);
template<typename T> int select(const string& sql,vector<T>& data);
int count_table_field(const string& table_name,const string& field_name);
private:
otl_connect db; // connect object
string db_infor_;
};
template<typename T> int Otlv4_Handle::insert(const string& sql,const vector<T>& data)
{
db.auto_commit_off();
otl_stream out;
out.open(INSERT_NUM, //buffer size should be == 1 always on INSERT on Linux MySQL.
//buffer size can be bigger than 2000 on Windows MySQL.
sql.c_str(),
db); // connectobject
//submit
for (size_t i = 0 ; i < data.size(); i++)
{
out<<data[i];
}
out.flush();
db.commit();
return 0;
}
template<typename T> int Otlv4_Handle::select(const string& sql,vector<T>& data)
{
//使用邦定变量类型
//sql = "select* from "+talbe;
db.auto_commit_off();
otl_stream in;
in.open(100, //buffer size
sql.c_str(),// SELECTstatement
db // connectobject
);
// copy all rows to be fetched into the vector
copy(otl_input_iterator<T,ptrdiff_t>(in),otl_input_iterator<T,ptrdiff_t>(),back_inserter(data));
return 0;
}
#endif
存储数据类定义
存储数据类头文件e_eledata.h
#ifndef E_ELEDATA_H
#define E_ELEDATA_H
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
#ifndef SCP_TYPE_H
#include "scp_type.h"
#endif
#ifndef SCP_EXPORT_H
#include "SCP_Export.h"
#endif
#ifndef OTLV4_HANDLE_H
#include "Otlv4_Handle.h"
#endif
class SCP_Export e_eledata
{
public:
friend SCP_Export otl_stream& operator<<(otl_stream& out , const e_eledata& eledata);
friend SCP_Export otl_stream& operator>>(otl_stream& in , e_eledata& eledata);
string to_string(void) const;
e_eledata();
~e_eledata();
e_eledata(const e_eledata& data);
e_eledata& operator=(const e_eledata& data);
int check_format(void);
static string insert_sql(void);
static string select_sql(void);
public:
id_type id;//64位机器这里不需要使用long,如果使用long则字节太长而打印不出来
id_type e_elemeterhead_id;
otl_datetime dldt;
double tae; //总有功电量。单位:kWh。
};
#endif