MySqlHelper.h
#ifndef DATACONTROL_H
#define DATACONTROL_H
#pragma once
#include <WinSock2.h>
#include <map>
#include <vector>
#include <iostream>
#include "Sql/mysql.h"
using namespace std;
class MySqlHelper
{
public:
MySqlHelper(void);
~MySqlHelper(void);
public:
//连接数据库
int FunConnectData(const CString &host,//主机或者IP地址
const CString &user, //用户名
const CString &passwd,//密码
const CString &db,//数据库名
UINT port,//端口
UINT client_flag);//客户连接参数
//批量执行SQL
void MultiInsert(const char *pSQL);
//关闭数据库连接
void CloseDataConnect();
//查询sql
void ExecuteQuerySql();
//开始事物
UINT Start_Transaction();
//提交事务(入库)
UINT Commit();
//回滚事务
UINT Rollback();
//调用存储过程
void CallPrc_AfterInsert(const CString &PrcName,const CString &strFileName,CString &strRetMsg);
/*处理返回多行的查询,返回影响的行数,pQuerySQL含Select的SQL语句
QuerySQL可通过fetch_QuerySQL取得结果,之后调用ReleaseAfterQuerySQL释放资源*/
MYSQL_RES* QuerySQL(const char *pQuerySQL);
//取得QuerySQL后的数据
MYSQL_ROW fetch_QuerySQL(MYSQL_RES *SQL_RES);
//释放执行SQL语句后的资源
void ReleaseAfterQuerySQL(MYSQL_RES *SQL_RES);
public:
//标示是否已经进行了数据库连接
bool m_bIsConnect;
//是否已提交事务
bool m_isCommit;
//记录SQL语句条数
unsigned long m_SQLCount;
//sql对象
MYSQL *m_SQLHandle;
};
#endif
MySqlHelper.cpp
#include "stdafx.h"
#include "MySqlHelper.h"
MySqlHelper::MySqlHelper(void)
{
m_bIsConnect = false;
m_isCommit = true;
m_SQLHandle=mysql_init(NULL);
//指定连接断开时,自动重连接
char ch = 1;
mysql_options(m_SQLHandle, MYSQL_OPT_RECONNECT, (char *)&ch);
mysql_options(m_SQLHandle, MYSQL_SET_CHARSET_NAME, "gb2312");
}
MySqlHelper::~MySqlHelper(void)
{
CloseDataConnect();
}
int MySqlHelper::FunConnectData(const CString &host,//主机或者IP地址
const CString &user, //用户名
const CString &passwd,//密码
const CString &db,//数据库名
UINT port,//端口
UINT client_flag)//客户连接参数
{
CloseDataConnect();
if (NULL == m_SQLHandle)
{
return -1;
}
if(mysql_real_connect(m_SQLHandle, host, user, passwd, db, port, NULL, client_flag) == NULL)
{
//连接数据库失败
//cout<<TEXT("数据库连接失败")<<endl;
return -1;
}
m_bIsConnect = TRUE;
return 0;
}
void MySqlHelper::MultiInsert(const char *pSQL)
{
CString strErrmsg;
MYSQL_RES *presult;
if (mysql_query(m_SQLHandle,pSQL) != 0)
{
return;
}
do
{
presult = mysql_store_result(m_SQLHandle);
mysql_free_result(presult);
m_SQLCount ++;
}while(!mysql_next_result(m_SQLHandle));
if (mysql_errno(m_SQLHandle) != 0)
{
return;
}
}
void MySqlHelper::CloseDataConnect()
{
if (m_bIsConnect)
{
mysql_close(m_SQLHandle);
m_bIsConnect = FALSE;
}
}
UINT MySqlHelper::Start_Transaction()
{
if (m_isCommit&&(mysql_autocommit(m_SQLHandle, 0) == 0))
{
m_isCommit = false;
m_SQLCount = 0;
return 0;
}
return -1;
}
UINT MySqlHelper::Commit()
{
if ((!m_isCommit)&&(mysql_commit(m_SQLHandle) == 0))
{
m_isCommit = true;
return 0;
}
return -1;
}
UINT MySqlHelper::Rollback()
{
if ((!m_isCommit)&&(mysql_rollback(m_SQLHandle) == 0))
{
m_isCommit = true;
return 0;
}
return -1;
}
void MySqlHelper::CallPrc_AfterInsert(const CString &PrcName,const CString &strFileName,CString &strRetMsg)
{
CString strSQL,strErrMsg;
//保存查询的结果俄
MYSQL_ROW row;
strSQL.Format("call %s (\'%s\',@ret)",PrcName,strFileName);
if(mysql_real_query(m_SQLHandle,strSQL,strSQL.GetLength()) != 0)
{
return;
}
MYSQL_RES *Res =QuerySQL("SELECT @ret");
row = fetch_QuerySQL(Res);
strRetMsg = row[0];
ReleaseAfterQuerySQL(Res);
}
MYSQL_RES* MySqlHelper::QuerySQL(const char *pQuerySQL)
{
if (NULL == m_SQLHandle)
{
return NULL;
}
MYSQL_RES *presult;
if (mysql_real_query(m_SQLHandle,pQuerySQL,strlen(pQuerySQL)) == 0)
{
//保存查询的结果
presult=mysql_store_result(m_SQLHandle);
//得到记录数量
return presult;
}
return NULL;
}
inline MYSQL_ROW MySqlHelper::fetch_QuerySQL(MYSQL_RES *SQL_RES)
{
MYSQL_ROW myRow;
myRow = mysql_fetch_row(SQL_RES);
return (myRow != NULL) ? myRow : NULL;
}
void MySqlHelper::ReleaseAfterQuerySQL(MYSQL_RES *SQL_RES)
{
if (NULL != SQL_RES)
{
mysql_free_result(SQL_RES);
SQL_RES =NULL;
}
}