C++连接MySQL数据库

前一段时间给大一的学弟学妹们讲解MySQL,随手用Java演示的怎么用外界应用程序连接MySQL数据库。但是好像他们都看不懂,而他们正好在学习C++,于是乎我就简单的用C++实现了一个MySQL的链接操作类。好几个月没有怎么接触C++了,感觉这个类弄得有点四不像,但是好歹能够运行吧。。。

头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>

#include <winsock.h> // 连接mysql需要此头文件

// MySQL Server 6.0安装位置下的include内*.h头文件用来提供C/C++连接MySQL的一下数据类型和函数
// 复制include文件夹入当前工程目录下
#include "include/mysql.h"
using namespace std;

// MySQL安装位置下的lib/opt/libmysql.lib用来提供头文件所提供函数的具体实现
// 复制libmysql.lib入当前目录下
#pragma comment(lib, "libmysql.lib")

class Tool
{
public:
void resultSQL(const char* sql);
void console();
int executeSQL(const char* sql);
void setCharset(const char* name);
void connect(const char *host, const char *user, const char *passwd, const char *db, unsigned int port);
Tool();
virtual ~Tool();
private:
MYSQL mysql; // 数据库实例
bool available; // 当前数据库对象是否可用标识符
};

具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "Tool.h"  

// 所有涉及mysql的函数(mysql_*(*))都可以在《mysql参考手册》的25.2小节中找到
// 主要是【25.2.1. C API数据类型】【25.2.2. C API函数概述】【25.2.1. C API函数描述】

Tool::Tool()
{
mysql_init(&mysql); // 分配并初始化MYSQL对象
available = false;
}

Tool::~Tool()
{
mysql_close(&mysql); // 关闭MYSQL连接
}

/*
host:主机名、localhost或IP地址等
user:用户名、MySQL的用户名
password:密码、MySQL的用户密码
db:数据库名称。如果db为NULL,连接会将默认的数据库设为该值
port:MySQL的链接端口
*/
void Tool::connect(const char *host, const char *user, const char *password, const char *db, unsigned int port)
{
if(NULL!=mysql_real_connect(&mysql, host, user, password, db, port, NULL, 0)){
available = true;
cout<<"Successful connection!"<<endl;
}
else{
cout<<"ERROR: "<<mysql_error(&mysql)<<endl;
}
}

/*
设置连接到MySQL的字符集
*/
void Tool::setCharset(const char *name)
{
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, name);
}

/*
可以执行表操作/增删改查/数据库操作等等
sql语句执行错误返回-2
如果为查询操作则返回-1
如果为修改操作则返回修改影响到的行数
*/
int Tool::executeSQL(const char *sql)
{
// 若valuable为false则说明MySQL连接尚不可用
if(!available)
return -2;
// 执行指定sql操作
cout<<sql<<endl;
if(!mysql_real_query(&mysql, sql, strlen(sql))){
// mysql_real_query函数执行结果为0则说明操作成功,返回影响的行数
return (int)mysql_affected_rows(&mysql);
}else{
// 如果操作失败则输出错误信息
cout<<mysql_error(&mysql)<<endl;
return -2;
}
}

void Tool::console()
{
if(!available)
return;
/*
简单模拟MySQL控制台、未实现
原理:重复读取输入字符串+执行executeSQL/resultSQL方法
*/
}

void Tool::resultSQL(const char *sql)
{
if(executeSQL(sql) != -1)
return;
// 此处基本上不可能出现result为NULL的情况
MYSQL_RES * result = mysql_store_result(&mysql);
MYSQL_FIELD *field;
while((field = mysql_fetch_field(result))) {
printf("field name: %s\n", field->name);
}
// 根据各个列取出结果、未实现

}