[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