[C++]C++连接MySQL,封装为class(兼容x86和x64)

最近帮一个客户写了一个C++连接MySQL,根据的客户的要求,完美的兼容xp,7,8,10的x86和x64平台

我也是通过一个demo改来的,调用的库文件   我也会加在后面,我满世界找才找到的兼容性较好的一个MySQL库

附上代码    为了保证客户的隐私  sql语句的一些敏感部分我改成了*

#ifndef CCONMYSQL_H_
#define CCONMYSQL_H_
#include <Windows.h>
#include <iostream>
#include "string"
#include "time.h"
#include "thread"
using namespace std;
#include "include\mysql.h"
typedef struct // 定义了一个结构体来存储MySQL连接信息
{
    const char* serverip;
    const char* user;
    const char* password;
    const char* database;
    int port;
}MySQLConInfo;
class  CCONMYSQL //定义一个MySQL连接类,封装各个功能
{
public:
    CCONMYSQL();
    ~CCONMYSQL();

public:
    void InitConnectInfor(const char *host, const char *user, const char *passwd, const char *db,unsigned int port );
    bool Open(); //打开连接
    bool QueryDatabase(string TableName);    //查询 函数直接返回是否查询成功,间接通过指针返回查询数据,结果集和记录集 MYSQL_RES MYSQL_ROW 
    void Close(); //关闭连接

    bool Search(string text, string uid, string tid, string shuxing);

    bool SelectValueandSwitch(string &Switch, string text, string tid, string uid, string shuxing);
    bool GetAllShuXing(string &shuxing,string text, string tid, string uid, int number);

private:
    MYSQL mydata; //必备的一个数据结构,不用管,定义了就行   是MySQL的API再用
    MySQLConInfo m_ConInfo; //连接登录信息
    MYSQL_FIELD *m_filed; //字段信息
    string CreateSQL(string text, string uid, string tid, string shuxing);
public:
    MYSQL_RES    *m_query;      //结果集      iColumn = m_query->field_count; iRow = m_query->row_count;
    MYSQL_ROW    m_row;  //记录集

};
#endif //CMYSQL_H
#include "CMYSQL.h"
#include "stdafx.h"

CCONMYSQL::CCONMYSQL()
{
    //Init lib
    if (0 == mysql_library_init(0, NULL, NULL)) {
        //cout << "初始化库成功" << endl;
    }
    else {
        //cout << "初始化库失败" << endl;
        throw "初始化库失败";
    }

    //init MYSQLDATA;
    if (NULL != mysql_init(&mydata)) {
        //cout << "MySQL初始化成功" << endl;
    }
    else {
        //cout << "MySQL初始化失败" << endl;
        throw "MySQL初始化失败";
    }

    //下面是 在连接数据库之前,设置额外的连接选项
    if (0 == mysql_options(&mydata, MYSQL_SET_CHARSET_NAME, "utf8")) { //可以设置的选项很多,这里设置字符集,否则无法处理中文
        //cout << "MySQL设置成功" << endl;
    }
    else {
        //cout << "MySQL设置失败" << endl;
        throw "MySQL设置失败";
    }
}

CCONMYSQL::~CCONMYSQL()
{
    
}

void CCONMYSQL::InitConnectInfor(const char *serverip, const char *user, const char *passwd, const char *db, unsigned int port)
{
    //初始化数据库连接信息
    m_ConInfo.serverip = serverip;
    m_ConInfo.user = user;
    m_ConInfo.password = passwd;
    m_ConInfo.database = db;
    m_ConInfo.port = port;

}
bool CCONMYSQL::Open()
{
    //下面是连接数据库
    if (NULL!= mysql_real_connect(&mydata, m_ConInfo.serverip, m_ConInfo.user, m_ConInfo.password, m_ConInfo.database,m_ConInfo.port, NULL, 0))
    {
        //cout << "数据库连接成功" << endl;
        return true ;
    }
    else {
        //cout << "数据库连接失败" << endl;
        throw "数据库连接失败";
        return false;
        /*if (mysql_errno(&mydata))
        {
            fprintf(stderr, "(错误原因 %d: %s)\n", mysql_errno(&mydata), mysql_error(&mydata));
            return false;
        }    */
    }
}

bool CCONMYSQL::QueryDatabase(string sql)
{
    if (mysql_query(&mydata, sql.c_str()))
    {
        //cout << "执行查询失败 长时间未连接 连接已丢失" << mysql_error(&mydata) << endl;
        throw mysql_error(&mydata);
        return false;
    }
    if (!(m_query = mysql_store_result(&mydata)))                 //获得sql语句结束后返回的结果集
    {
        return false;
    }
    //printf("iRrow = %d \n", m_query->row_count);                //行数、列数为 m_query->field_count
    if (m_query->row_count > 0)
    {
        //cout << "真" << endl;
        return true;
    }
    else
    {
        //cout << "假" << endl;
        return false;
    }
    
    return true;
}
string CCONMYSQL::CreateSQL(string text,string uid,string tid,string shuxing)
{
    string sql1("SELECT * FROM * WHERE * = '");
    string sql2("' AND * ='");
    string sql3("' AND * = '");
    string sql4("' AND * LIKE '");
    string sql5("'\0");
    string all = sql1 + tid + sql2 + uid + sql3 + shuxing + sql4 + text + sql5;
    //cout << all;
    return all;
}
bool CCONMYSQL::GetAllShuXing(string &shuxing,string text, string tid, string uid,int number)
{
    InitConnectInfor("ip", "用户名", "密码", "数据库", 3306);
    char * result = new char[number];
    for (int i = 0; i < number; i++)
    {
        result[i] = '0';
    }
    Open();
    string sql1("SELECT * FROM * WHERE * = '");
    string sql2("' AND * ='");
    string sql3("' AND * LIKE '");
    string sql4("'\0");
    string all = sql1 + tid + sql2 + uid + sql3 + text + sql4;
    int iColumn = 0;
    //记录数(行)
    int    iRow = 0;

    if (mysql_query(&mydata, all.c_str()))
    {
        return false;
    }
    if (!(m_query = mysql_store_result(&mydata)))                 //获得sql语句结束后返回的结果集
    {
        return false;
    }
    iColumn = m_query->field_count;
    iRow = m_query->row_count;

    while (m_row = mysql_fetch_row(m_query))   //在已知字段数量情况下,获取并打印下一行  
    {
        for (int i = 0; i < iColumn; i++)
        {
            //printf("%s\t\t", m_row[i]);
            int temp = atoi(m_row[i]);
            result[temp] = '1';
        }
    }
    shuxing = string(result);
    Close();
    return true;
}
bool CCONMYSQL::Search(string text, string uid, string tid, string shuxing)
{
    

    string Switch;

    //string sql = CreateSQL(m_text, m_uid, string(t_tid), string(t_shuxing));

    InitConnectInfor("ip", "用户名", "密码", "数据库", 3306);

    Open();

    SelectValueandSwitch(Switch,text, tid, uid, shuxing);

    if (Switch == string("1")){
        return false;
    }
    

    string sql = CreateSQL(text, uid, tid, shuxing);

    if (QueryDatabase(sql.c_str()))
    {
        Close();
        return true;
    }
    else
    {
        Close();
        return false;
    }

}
bool CCONMYSQL::SelectValueandSwitch(string &Switch, string text, string tid, string uid, string shuxing)
{
    string sql1("SELECT * FROM * WHERE * = '");
    string sql2("'AND * = '");
    string sql3("' AND * = '");
    string sql4("' AND * = '");
    string sql5("'");
    string all = sql1 + tid + sql2 + uid + sql3 + shuxing +sql4 + text +sql5;
    if (mysql_query(&mydata, all.c_str()))
    {
        //cout << "Query failed " << mysql_error(&mydata) << endl;
        return false;
    }
    if (!(m_query = mysql_store_result(&mydata)))
    {
        return false;
    }

    int Column = m_query->field_count;
    int Row = (int)m_query->row_count;
    if (Row > 0)
    {
        m_row = mysql_fetch_row(m_query);
        //Value = string(m_row[0]);
        Switch = string(m_row[0]);
    }
    else
    {
        return false;
    }
    //cout << Value << " " << Switch << endl;
    return true;
}

void CCONMYSQL::Close() //关闭数据库连接
{
    mysql_close(&mydata);
    mysql_server_end();
}

 

大家异步CSDN下载库  https://download.csdn.net/download/leeli73/10298838

posted @ 2018-03-20 23:43  leeli73  阅读(1370)  评论(0编辑  收藏  举报