您的位置:首页 > 编程语言 > C语言/C++

MySql C++调用库Connector/c++编译 和 接口封装【三】Connector/c++ 使用总结及封装

2015-09-10 19:51 549 查看
工程需要加上各个路径:

库使用需要几个文件:
  1、include 文件夹   c/c++ /常规/附加包含目录
   Connector/c++ 的安装版里面的Include 文件夹。或者把  /driver以及/driver/nativeapi 里面的头文件拷贝到一个文件夹里面(注意nativeapi要改名为 cppconn)。
  2、Connector/c++ 库文件 和 MySql库文件:
    2.1、mysqlcppconn.dll   /debug,exe生成目录
    2.2、mysqlcppconn.lib   链接器/输入/附加依赖项
    2.3、libmysql.dll    /debug 
  3、boost库所在目录   c/c++/常规/附加包含目录


头文件 MySqlDataBase.h :

#ifndef __MYSQL_DATABASE_H
#define __MYSQL_DATABASE_H

#include "mysql_connection.h"
#include "mysql_driver.h"
#include "cppconn/prepared_statement.h"
#include "cppconn/statement.h"
#include <map>

typedef boost::scoped_ptr<sql::Connection> Connection;
typedef boost::scoped_ptr<sql::PreparedStatement> PreparedStatement;
typedef boost::scoped_ptr<sql::Statement> Statement;
typedef boost::shared_ptr<sql::ResultSet> ResultSet;
typedef sql::mysql::MySQL_Driver MySQL_Driver;

//mysql 错误类
class CMySqlError
{
//存储变量
protected:
int                        m_ErrorCode;
std::string                m_strErrorDescribe;

public:
//构造函数
CMySqlError();
//析构函数
~CMySqlError();
public:
//获取ErrorCode
int getErrorCode(){    return m_ErrorCode;    }
//错误描述
std::string GetErrorDestribe(){    return m_strErrorDescribe;    }

public:
//设置错误
void SetErrorInfo(sql::SQLException &e);
};

class CMySqlDataBase
{
//信息变量
protected:
CMySqlError                            m_MySqlError;            //当前错误信息
std::map<std::string, std::string>    m_ConnectProperties;    //连接信息

//状态变量
protected:
const unsigned int        m_dwTryConnectTimes;

//连接变量
protected:
Connection            m_DBConnect;
PreparedStatement    m_DBPrepareState;
ResultSet            m_DBRecordSet;

//函数定义
public:
//构造函数
CMySqlDataBase();
//析构函数
~CMySqlDataBase();

//管理接口
public:
//打开连接
bool OpenConnect();
//关闭记录
bool CloseRecordset();
//关闭连接
bool CloseConnect();
//重新连接(未实现)
bool TryConnectAgain();
//设置信息
bool SetConnectionInfo(const std::string &hostIp,unsigned short hostPort,const std::string &dataBaseName,const std::string &userName,const std::string &password);

//状态接口(未实现)
public:
//是否连接错误
bool IsConnectError();
//是否打开
bool IsRecordsetOpened();

//
public:
//准备prepareState
bool PreparedExcute(const std::string &szCommand);

bool setBigInt(unsigned int parameterIndex, const std::string& value);

bool setBlob(unsigned int parameterIndex, std::istream * blob);            //长文本字符串

bool setBoolean(unsigned int parameterIndex, bool value);

bool setDateTime(unsigned int parameterIndex, const std::string& value);

bool setDouble(unsigned int parameterIndex, double value);

bool setInt(unsigned int parameterIndex, int32_t value);

bool setUInt(unsigned int parameterIndex, uint32_t value);

bool setInt64(unsigned int parameterIndex, int64_t value);

bool setUInt64(unsigned int parameterIndex, uint64_t value);

bool setString(unsigned int parameterIndex, const std::string& value);

bool setNull(unsigned int parameterIndex, int sqlType);

//执行命令(存储过程)
bool ExecuteCommand(bool bRecordset);

//执行语句接口
public:
//执行查询(Select)
bool Query(const std::string &szCommand);
//执行语句(Insert,Update,Delete)
bool Execute(const std::string &szCommand);

//字段接口
/* next() must been used before getdata */
public:
//获取当前 Result set
const ResultSet &GetRecordSet();
//get Next Record set
bool GetNextResultSet();
//move resultset to the nth result in the set
bool NextFieldExist();
//获取参数
bool GetFieldValue(const std::string& columnLabel,bool &bValue);
//获取参数
bool GetFieldValue(const std::string& columnLabel,long double &dbValue);
//获取参数
bool GetFieldValue(const std::string& columnLabel,int32_t &nValue);
//获取参数
bool GetFieldValue(const std::string& columnLabel,uint32_t &uValue);
//获取参数
bool GetFieldValue(const std::string& columnLabel,int64_t &llValue);
//获取参数
bool GetFieldValue(const std::string& columnLabel,uint64_t &lluValue);
//获取参数
bool GetFieldValue(const std::string& columnLabel,char szBuffer[],uint32_t uSize);
//获取参数
bool GetFieldValue(const std::string& columnLabel,std::string &szValue);
//获取参数
//bool GetFieldValue(const std::string& columnLabel,SYSTEMTIME &systime);

//内部函数
private:
//设置错误
void SetErrorInfo(sql::SQLException &e);
};

#endif


源文件MySqlDataBase.cpp

#include "MySqlDataBase.h"
#include <sstream>

CMySqlError::CMySqlError()
{
}

CMySqlError::~CMySqlError()
{
}

void CMySqlError::SetErrorInfo(sql::SQLException &e)
{
m_ErrorCode = e.getErrorCode();
m_strErrorDescribe = e.what();

throw this;
}

CMySqlDataBase::CMySqlDataBase():m_DBConnect(NULL),m_DBPrepareState(NULL),m_DBRecordSet((sql::ResultSet*)NULL),m_dwTryConnectTimes(1)
{
}

CMySqlDataBase::~CMySqlDataBase()
{
try
{
CloseConnect();

m_DBRecordSet.reset((sql::ResultSet*)NULL);
m_DBPrepareState.reset(NULL);
m_DBConnect.reset(NULL);
}
catch(sql::SQLException &e) { SetErrorInfo(e);}
}

//设置错误
void CMySqlDataBase::SetErrorInfo(sql::SQLException &e)
{
m_MySqlError.SetErrorInfo(e);
}

//打开连接
bool CMySqlDataBase::OpenConnect()
{
//建立连接
try
{
sql::mysql::MySQL_Driver *driver = sql::mysql::get_mysql_driver_instance();

m_DBConnect.reset(driver->connect(m_ConnectProperties["hostName"],m_ConnectProperties["userName"],m_ConnectProperties["password"]));
m_DBConnect->setSchema(m_ConnectProperties["schema"]);
}
catch(sql::SQLException &e) { SetErrorInfo(e);}

return true;
}

//关闭记录
bool CMySqlDataBase::CloseRecordset()
{
try
{
if(m_DBPrepareState != NULL)
{
while(m_DBPrepareState->getMoreResults())
m_DBRecordSet.reset(m_DBPrepareState->getResultSet());

m_DBPrepareState.reset(NULL);
}

if(m_DBRecordSet != NULL)
m_DBRecordSet.reset((sql::ResultSet*)NULL);
return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//关闭连接
bool CMySqlDataBase::CloseConnect()
{
try
{
CloseRecordset();

//close connect
if(m_DBConnect != NULL)
{
m_DBConnect.reset(NULL);
}

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//设置信息
bool CMySqlDataBase::SetConnectionInfo(const std::string &hostIp,unsigned short hostPort,const std::string &dataBaseName,const std::string &userName,const std::string &password)
{
try
{
std::stringstream hostss;
hostss<<"tcp://"<<hostIp<<":"<<hostPort;

m_ConnectProperties["hostName"] = hostss.str();
m_ConnectProperties["userName"] = userName;
m_ConnectProperties["password"] = password;
m_ConnectProperties["schema"] = dataBaseName;

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//是否打开
bool CMySqlDataBase::IsRecordsetOpened()
{
if(m_DBRecordSet == NULL)
return false;

if(m_DBRecordSet->isClosed())
return false;

return true;
}

//准备prepareState
bool CMySqlDataBase::PreparedExcute(const std::string &szCommand)
{
if(szCommand.empty())    return false;

//close RecordSet;
CloseRecordset();
try
{
m_DBPrepareState.reset(m_DBConnect->prepareStatement(szCommand));
m_DBPrepareState->clearParameters();

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

bool CMySqlDataBase::setBigInt(unsigned int parameterIndex, const std::string& value)
{
try
{
m_DBPrepareState->setBigInt(parameterIndex,value);

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

bool CMySqlDataBase::setBlob(unsigned int parameterIndex, std::istream * value)            //长文本字符串
{
try
{
m_DBPrepareState->setBlob(parameterIndex,value);

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

bool CMySqlDataBase::setBoolean(unsigned int parameterIndex, bool value)
{
try
{
m_DBPrepareState->setBoolean(parameterIndex,value);

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

bool CMySqlDataBase::setDateTime(unsigned int parameterIndex, const std::string& value)
{
try
{
m_DBPrepareState->setDateTime(parameterIndex,value);

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

bool CMySqlDataBase::setDouble(unsigned int parameterIndex, double value)
{
try
{
m_DBPrepareState->setDouble(parameterIndex,value);

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

bool CMySqlDataBase::setInt(unsigned int parameterIndex, int32_t value)
{
try
{
m_DBPrepareState->setInt(parameterIndex,value);

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

bool CMySqlDataBase::setUInt(unsigned int parameterIndex, uint32_t value)
{
try
{
m_DBPrepareState->setUInt(parameterIndex,value);

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

bool CMySqlDataBase::setInt64(unsigned int parameterIndex, int64_t value)
{
try
{
m_DBPrepareState->setInt64(parameterIndex,value);

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

bool CMySqlDataBase::setUInt64(unsigned int parameterIndex, uint64_t value)
{
try
{
m_DBPrepareState->setUInt64(parameterIndex,value);

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

bool CMySqlDataBase::setString(unsigned int parameterIndex, const std::string& value)
{
try
{
m_DBPrepareState->setString(parameterIndex,value);

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

bool CMySqlDataBase::setNull(unsigned int parameterIndex, int sqlType)
{
try
{
m_DBPrepareState->setNull(parameterIndex,sqlType);

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//执行命令(存储过程)
bool CMySqlDataBase::ExecuteCommand(bool bRecordset)
{
try
{
m_DBPrepareState->executeUpdate();

if(bRecordset)
m_DBRecordSet.reset(m_DBPrepareState->getResultSet());

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//执行查询(Select)
bool CMySqlDataBase::Query(const std::string &szCommand)
{
if(szCommand.empty())    return false;

//close RecordSet;
CloseRecordset();
try
{
m_DBPrepareState.reset(m_DBConnect->prepareStatement(szCommand));

m_DBPrepareState->executeUpdate();
m_DBRecordSet.reset(m_DBPrepareState->getResultSet());
return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//执行语句(Insert,Update,Delete)
bool CMySqlDataBase::Execute(const std::string &szCommand)
{
if(szCommand.empty())    return false;

//close RecordSet;
CloseRecordset();
try
{
m_DBPrepareState.reset(m_DBConnect->prepareStatement(szCommand));
m_DBPrepareState->executeUpdate();

return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//获取当前 Result set
const ResultSet &CMySqlDataBase::GetRecordSet()
{
return m_DBRecordSet;
}

//get Next Record set
bool CMySqlDataBase::GetNextResultSet()
{
if(m_DBPrepareState == NULL)
return false;

if(m_DBPrepareState->getMoreResults())
{
m_DBRecordSet.reset(m_DBPrepareState->getResultSet());
return true;
}
return false;
}

//next
bool CMySqlDataBase::NextFieldExist()
{
if(m_DBRecordSet == NULL)
return false;

return m_DBRecordSet->next();
}

//获取参数
bool CMySqlDataBase::GetFieldValue(const std::string& columnLabel,bool &bValue)
{
bValue = false;

if(!IsRecordsetOpened())
return false;

try
{
bValue =  m_DBRecordSet->getBoolean(columnLabel);
return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//获取参数
bool CMySqlDataBase::GetFieldValue(const std::string& columnLabel,long double &dbValue)
{
dbValue = 0.00;

if(!IsRecordsetOpened())
return false;

try
{
dbValue =  m_DBRecordSet->getDouble(columnLabel);
return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//获取参数
bool CMySqlDataBase::GetFieldValue(const std::string& columnLabel,int32_t &nValue)
{
nValue = 0;

if(!IsRecordsetOpened())
return false;

try
{
nValue =  m_DBRecordSet->getInt(columnLabel);
return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//获取参数
bool CMySqlDataBase::GetFieldValue(const std::string& columnLabel,uint32_t &uValue)
{
uValue = 0;

if(!IsRecordsetOpened())
return false;

try
{
uValue =  m_DBRecordSet->getUInt(columnLabel);
return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//获取参数
bool CMySqlDataBase::GetFieldValue(const std::string& columnLabel,int64_t &llValue)
{
llValue = 0;

if(!IsRecordsetOpened())
return false;

try
{
llValue =  m_DBRecordSet->getInt64(columnLabel);
return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//获取参数
bool CMySqlDataBase::GetFieldValue(const std::string& columnLabel,uint64_t &lluValue)
{
lluValue = 0;

if(!IsRecordsetOpened())
return false;

try
{
lluValue =  m_DBRecordSet->getUInt64(columnLabel);
return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//获取参数
bool CMySqlDataBase::GetFieldValue(const std::string& columnLabel,char szBuffer[],uint32_t uSize)
{
memset(szBuffer,0,uSize);

if(!IsRecordsetOpened())
return false;

try
{
sql::SQLString tempstr =  m_DBRecordSet->getString(columnLabel);
strncpy(szBuffer,tempstr.c_str(),uSize-1);
return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

//获取参数
bool CMySqlDataBase::GetFieldValue(const std::string& columnLabel,std::string &szValue)
{
if(!IsRecordsetOpened())
return false;

try
{
szValue =  m_DBRecordSet->getString(columnLabel).asStdString();
return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}

/*
//获取参数,SYSTEMTIME 可以通过 COleDateTime(const SYSTEMTIME& systimeSrc) 转换为 COleDateTime
bool CMySqlDataBase::GetFieldValue(const std::string& columnLabel,SYSTEMTIME &systime)
{
if(!IsRecordsetOpened())
return false;
memset(&systime,0,sizeof(SYSTEMTIME));
try
{
std::string timestr =  m_DBRecordSet->getString(columnLabel).asStdString();
sscanf(timestr.c_str(),"%04d-%02d-%02d %02d:%02d:%02d",&systime.wYear,&systime.wMonth,&systime.wDay,
&systime.wHour,&systime.wMinute,&systime.wSecond);
return true;
}
catch (sql::SQLException &e) { SetErrorInfo(e);}

return false;
}
*/


检查内存增长测试的 leakcheck.h:

#pragma once

#define CRTDBG_MAP_ALLOC
#include <windows.h>
#include <tchar.h>
#include <crtdbg.h>
#include <stdlib.h>
#include <iostream>
#include <Psapi.h>
#pragma comment(lib,"psapi.lib")

#ifdef _DEBUG
#define malloc(s)           _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define calloc(c, s)        _calloc_dbg(c, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define realloc(p, s)       _realloc_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)

#define new                    new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif

#define DEFAULT_OUT_TITLE    \
TEXT("缺页中断数  工作集(KB)  虚存(KB)  虚存峰值(KB)")
#define DEFAULT_OUTPUT_FORMAT    \
TEXT("  %u    %u    %u    %u  ")

// 字节单位转换,向0取整
#define B2KB(x)    ((x) >> 10)

///////////////////////////////////////////////////////////////////////////////////

void ConstructOutput()
{
PROCESS_MEMORY_COUNTERS pmc;
std::cout<<DEFAULT_OUT_TITLE<<std::endl;
if(!GetProcessMemoryInfo(GetCurrentProcess(),&pmc,sizeof(pmc)))return ;

char output[512] = {0};
_sntprintf(output,sizeof(output),DEFAULT_OUTPUT_FORMAT,
(pmc.PageFaultCount),B2KB(pmc.WorkingSetSize),B2KB(pmc.PagefileUsage),B2KB(pmc.PeakPagefileUsage));
std::cout<<output<<std::endl;
}


调用 test.cpp

#include "MySqlDataBase.h"
#include "leakcheck.h"
using namespace std;

int main()
{
CMySqlDataBase mysqldb;
try{
mysqldb.SetConnectionInfo("127.0.0.1",3306,"test","root","123456");
mysqldb.OpenConnect();
ConstructOutput();          //这个函数用来查看当前内存大小的
//for(int i = 0;i<100000;++i)
{
mysqldb.PreparedExcute("call testproc1(?)");
mysqldb.setInt(1,1001)
mysqldb.ExecuteCommand(true);
while(mysqldb.NextFieldExist())
{
int id;
std::string name;
mysqldb.GetFieldValue("id",id);
mysqldb.GetFieldValue("date",name);
cout<<"id:"<<id<<", name:"<<name<<endl;
}
}
ConstructOutput();
mysqldb.CloseConnect();
}
catch(CMySqlError *pSqlError)
{
cout<<pSqlError->getErrorCode()<<":"<<pSqlError->GetErrorDestribe()<<endl;
mysqldb.CloseConnect();
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: