C++ OTL MySQL(Windows/Linux) 最后更新时间:2018-01-06 otlv4.h Version 4.0.420

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ClamReason/article/details/41282515

有需要的联系 QQ 3508551694 请尊重劳动者的成果,本资源付费使用。

1 增加了对Windows MFC程序的支持

2 支持VS2010-VS2015

Windows每秒钟10000条以上插入;Linux每秒插入300条以上。Q269752451

输出截图:

Linux输出:

Windows输出:
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 ([email protected])
// 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

批量提交

因不同的数据库以及不同的操作系统,批量提交的buffer size有所不同,见官方示例代码:
Windows MySQL 可以设置大于10000
Linux MySQL 暂时设置成1.


配置ODBC数据源


猜你喜欢

转载自blog.csdn.net/ClamReason/article/details/41282515