最近幫一個客戶寫了一個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