C++ OTL Windows/Linux 最后更新时间:2021-12-26

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数据源即可。

MFC程序输出:

测试代码

main.cpp
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;
};

使用:

Windows下:直接打开工程编译运行(填写一下用户名、密码、ODBC数据源名称即可)
Linux下:直接make,运行(填写一下用户名、密码、ODBC数据源名称即可)

版本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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值