CMySQLMgr.h:

#ifndef _CMYSQLMGR_H_
#define _CMYSQLMGR_H_ #include <iostream>
#include "mysql.h" using namespace std; class CMySQLMgr
{
public:
CMySQLMgr();
~CMySQLMgr(); bool Connect(const char * sHost, const char * sUser, const char * sPwd, const char * sDbName, const char * sPort);
void CloseConnect(); bool excute(const char * sQuery); MYSQL * GetpMysql(); private:
MYSQL * m_pMysql;
}; #endif

  

CMySQLMgr.cpp:

#include "CMySQLMgr.h"

CMySQLMgr::CMySQLMgr()
{
m_pMysql = NULL;
} CMySQLMgr::~CMySQLMgr()
{ } bool CMySQLMgr::Connect( const char * sHost, const char * sUser, const char * sPwd, const char * sDbName, const char * sPort )
{
bool bReturn = true;
do
{
CloseConnect();
m_pMysql = mysql_init(NULL);
if (!m_pMysql)
{
bReturn = false;
//can write log
break;
} //参数设置
char optvalue = 6;
mysql_options(m_pMysql, MYSQL_OPT_CONNECT_TIMEOUT, (char*)&optvalue);
optvalue = 1;
mysql_options(m_pMysql, MYSQL_OPT_RECONNECT, (char*)&optvalue);
optvalue = 2;
mysql_options(m_pMysql, MYSQL_OPT_READ_TIMEOUT, (char*)&optvalue); if (!mysql_real_connect(m_pMysql, sHost, sUser, sPwd, sDbName, atoi(sPort), NULL, 0) )
{
bReturn = false;
//can write log
cout << "mysql error:" << mysql_error(m_pMysql);
break;
}
} while (0); return bReturn;
} void CMySQLMgr::CloseConnect()
{
if (m_pMysql)
{
mysql_close(m_pMysql);
}
} bool CMySQLMgr::excute( const char * sQuery )
{
bool bReturn = true;
try
{
if (0 != mysql_query(m_pMysql, sQuery))
{
bReturn = false;
cout << "mysql error:" << mysql_error(m_pMysql);
//can write log
}
}
catch (std::exception &e)
{
cout << "exception:" << e.what() << endl;
}
catch (...)
{
cout << "Unknown exception." << endl;
} return bReturn;
} MYSQL * CMySQLMgr::GetpMysql()
{
if (m_pMysql)
{
return m_pMysql;
}
}

main.cpp:

#include <iostream>
#include <stdio.h>
#include "CMySQLMgr.h"
using namespace std; int main()
{
CMySQLMgr mysql;
bool bRet = mysql.Connect("172.16.8.110", "root", "123456", "scistock", "3306"); char buf[1024*2] = {0}; const char * sSql = "select * from calcgsdataflash where gscode = 'ZTJB' ";
bRet = mysql.excute(sSql);
if (!bRet)
{
cout << "sSql:" << sSql << " excute error" << endl;
} MYSQL_RES *res;
MYSQL_ROW row;
MYSQL_FIELD *fields;
res = mysql_store_result(mysql.GetpMysql());
if (res)
{
int nFields = mysql_num_fields(res);
fields = mysql_fetch_fields(res); while ((row = mysql_fetch_row(res)))
{
string gpcode;
int ymd = 0;
int hms = 0;
float f10 = 0;
for (int j = 0; j < nFields; j++)
{
if (row[j])
{
if (strncmp(fields[j].name, "gpcode", strlen("gpcode")) == 0)
{
gpcode = row[j];
}
else if (strncmp(fields[j].name, "ymd", strlen("ymd")) == 0)
{
ymd = atoi(row[j]);
}
else if (strncmp(fields[j].name, "hms", strlen("hms")) == 0)
{
hms = atoi(row[j]);
int hour = hms / 3600;
int minute = hms / 60 % 60;
int second = hms % 60;
hms = hour * 10000 + minute * 100 + second;
}
else if (strncmp(fields[j].name, "f10", strlen("f10")) == 0)
{
f10 = atoi(row[j]);
}
}
} sprintf(buf, "update calcgsdataflash set hms = %d WHERE gscode = 'ZTJB' AND ymd = %d AND gpcode = '%s' AND f10 = %f", hms, ymd, gpcode.c_str(), f10);
cout << "sSql:" << buf << endl;
bool bRet = mysql.excute(buf);
if (!bRet)
{
cout << "sSql:" << buf << " excute error" << endl;
}
}
mysql_free_result(res);
}
mysql.CloseConnect();
return 0;
}

 

MySQL官网(https://www.mysql.com/

Api 连接库下载地址(https://dev.mysql.com/downloads/connector/c/

Windows :

  1.从官网下载Windows的对应版本的连接库。

    

  2.解压 1 中下载的压缩包

     

  3.vs 项目中加入 2 中库文件目录下的 include文件夹、lib文件夹下的 libmysql.lib。

    (将 libmysql.dll 拷贝至可执行程序目录下)

    项目配置(Debug or Release、Win32 or x64)要与下载的库版本保持一致。

    若 Release 模式下需要断点调试,参见:http://www.cnblogs.com/SZxiaochun/p/6928854.html

    

Linux:

  1.从官网下载 Linux 对应版本的连接库

    

  2.安装库

    1.如果下载的是压缩包

      

      解压之后

        sudo cp -r include/ /usr/include/mysql/

        sudo cp -r lib/ /usr/lib64/mysql/

    2.如果下载的是 .rpm 文件,直接安装

        sudo rpm -ivh mysql-connector-c-devel-6.1.11-1.el7.x86_64.rpm (rpm 命令的用法参见:http://www.cnblogs.com/SZxiaochun/p/7718606.html

    3.makefile 引用安装的库

      1.静态库 libmysqlclient.a

         

      2.动态库 libmysqlclient.so (如果安装之后没有 libmysqlclient.so ,只有 libmysqlclient.so.18.0.0,就链接一下 ln libmysqlclient.so.18.0.0 libmysqlclient.so ,或者重命名也行)

         

批量插入:

//InnoDB表引擎下关闭mysql自动事务提交可以大大提高数据插入的效率,这是因为如果需要插入1000条数据,    mysql会自动发起(提交)1000次的数据写入请求,如果把autocommit关闭掉,通过程序来控制,只要一 次commit就可以搞定。

#define WRITE_ONCE_COUNT  1000  //设一个宏,表示多少条数据提交一次

int count = 0;            //设一个计数值

mysql_autocommit(mysql,0);//关闭自动提交

sprintf(buf,"insert into dxjl_infobase(Date,gpcode,Type) values(%d,'%s',%d)",nDate,codes,1);

ASC2UTF8(buf,buf,sizeof(buf));//转编码,将ASC转为UTF8  以便数据库可以识别sql语句

int iSuccess = mysql_query(mysql,buf);
if(iSuccess !=0)
{
printf("mysql_query:%s\r\n",mysql_error(mysql));
}
else
{
count ++;
}
if(WRITE_ONCE_COUNT == count)//每WRITE_ONCE_COUNT条数据提交一次
{
mysql_commit(mysql);
count = 0;
}
出了循环之后加个判断,避免最后一次循环数据未达到WRITE_ONCE_COUNT,无法commit提交写库:
if(0 < count)
{
mysql_commit(mysql);
}

autocommit是事务,==1时是立即提交,==0之后遇到commit或rollback才提交。

C API 连接MySQL及批量插入的更多相关文章

  1. jmeter连接mysql数据库批量插入数据

    前提工作: 1.在jmeter官网下载jmeter包(官网地址:https://jmeter.apache.org/).此外还需下载mysql驱动包,如:mysql-connector-java-5. ...

  2. Mysql 如何批量插入百万行测试数据

    Mysql 如何批量插入百万行测试数据

  3. Mysql优化批量插入数据

    最近为了测试项目,需要在Mysql中插入百万级测试数据,于是用到了批量插入,自己写了个简单的Spring Cloud项目. 开始时执行效率很慢,大概100条/秒,批次的大小也试过1000,2000,5 ...

  4. php如何在mysql里批量插入数据

    假如说我有这样一个表,我想往这个表里面插入大量数据 CREATE TABLE IF NOT EXISTS `user_info` ( `id` int(11) NOT NULL AUTO_INCREM ...

  5. mysql+ibatis 批量插入

    述:相比oracle批量插入,mysql批量插入就简单的多了,mysql支持values后面跟多条数据,进行批量插入,并且主键可以自增,不像oracle会遇到序列问题. 1.建表 CREATE TAB ...

  6. C Mysql API连接Mysql

    最近都在查看MYsql C API文档,也遇到了很多问题,下面来简单的做一个总结. mysql多线程问题 mysql多线程处理不好,经常会发生coredump,见使用Mysql出core一文. 单线程 ...

  7. Mybatis 针对ORACLE和MYSQL的批量插入与多参数批量删除

    今天利用Mybatis的<for each>标签做oracle的批量插入数据时,发现和MySQL数据库有区别.在此记录下,以防之后再踩坑. 一.批量插入: 1.controller: /* ...

  8. 向mysql中批量插入数据的性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 5 ...

  9. mysql 循环批量插入

    背景 前几天在MySql上做分页时,看到有博文说使用 limit 0,10 方式分页会有丢数据问题,有人又说不会,于是想自己测试一下.测试时没有数据,便安装了一个MySql,建了张表,在建了个whil ...

随机推荐

  1. EF相同Context升级为分布式事务的原因

    http://www.digitallycreated.net/Blog/48/entity-framework-transactionscope-and-msdtc

  2. java 随机日期

    java 在某个范围日期内获取一个日期,再以这个日期作为开始日期,获取到随机n天后的日期 /** * 在beginDate和endDate之间获取一个随机日期作为开始日期 * @param begin ...

  3. hdu 5289 Assignment(给一个数组,求有多少个区间,满足区间内的最大值和最小值之差小于k)

    1.区间是一段的,不是断开的哟 2.代码是看着标程写的 3.枚举左端点,二分右端点流程: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L ...

  4. 浅谈CPU,GPU,TPU,DPU,NPU,BPU

    https://www.sohu.com/a/191538165_777155 A12宣传的每秒5万亿次运算,用计算机语言描述就是5Tops. 麒麟970 NPU,根据资料是 1.92Tops. 麒麟 ...

  5. fis速查(不断更新)

    模块化开发-pure: http://hefangshi.github.io/fis-site/docs/advance/modjs-solution.html 三种语言能力(资源定位,内容嵌入,依赖 ...

  6. 关于shell

    操作系统本质上是一个应用程序,他负责硬件资源调度,文件系统管理等最底层的工作. 而shell是系统中一种特别的应用程序.之所以特别,是因为用户一切的操作都是经由shell来实现的. 和我们直接进行交互 ...

  7. iOS截屏功能

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // ...

  8. Oracle PLSQL Demo - 16.弱类型REF游标[没有指定查询类型,已指定返回类型]

    declare Type ref_cur_variable IS REF cursor; cur_variable ref_cur_variable; rec_emp scott.emp%RowTyp ...

  9. C10K问题及解决方案

    转载自:http://blog.csdn.net/wangtaomtk/article/details/51811011 1 C10K问题 大家都知道互联网的基础就是网络通信,早期的互联网可以说是一个 ...

  10. java调用c库实例

    java由于语言限制,不能使用char*作为返回值. 局部变量的字符串不能正常返回,vc可以正常接收,java不能接收. c语言 int __stdcall GetCharacterCodeJn(ch ...