最近帮一个客户写了一个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();
}