c mysql数据接着插入_C API 连接MySQL及批量插入

CMySQLMgr.h:

#ifndef _CMYSQLMGR_H_

#define _CMYSQLMGR_H_

#include

#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

#include

#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;

}

Windows :

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

532653f2011fc7e35c3687abd62d63a0.png

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

cf322b75b75a7232ec789b13012612d0.png

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

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

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

ae1f86f9dc38ec1d656f9aa4fee64808.png

Linux:

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

60afcb3a05921798d8bfc5dae6660fef.png

2.安装库

1.如果下载的是压缩包

d600b359de4fe1c206b6546eaebdf7a6.png

解压之后

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

65ec0d158c888612691d1c25fbd6f8d1.png

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

5463bc78790380d7ebbf7a442ca45cbb.png

批量插入:

//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才提交。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值