zoukankan      html  css  js  c++  java
  • [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 "includemysql.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)
    ", 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 
    ", 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("'");
        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("'");
        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		", 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

  • 相关阅读:
    Sonar+IDEA + Maven的集成
    My97DatePicker IE9中,显示全部为1
    Datatable+jeditable+Java 结合使用实现表格的单行刷新
    Datatables表格控件的使用相关网站及遇到的问题
    xss 小练习
    主页面布局 随浏览器大小变化而变化
    使用angular中自定义的directive实现删除确认框
    使用css和js完成模态弹窗功能
    ckplayer插件的使用
    使用JQuery进行表格分页查询
  • 原文地址:https://www.cnblogs.com/lee-li/p/8613697.html
Copyright © 2011-2022 走看看