前言:

前阵子接了一单C语言数据结构与算法期末综合作业的单子,客户要求做一个连连看小游戏,要求使用至少四种算法实现功能,并且玩家完成游戏后把分数记录到MySQL数据库中。再此之前我从未使用C语言连接过数据库,只会 Java 、Python 连接数据库操作,我一开始跑去问学嵌入式的学长如何实现 C 语言连接数据库, 结果他也不会…

那我只能百度呀百度,但是百度别人写的还是不够详细,我按照要求引入 mysql.h, libmysql.lib 还是各种报错,搞得我心态有点崩了,特此记下详细实现不同操作系统下C语言连接MySQL数据库操作。

Windows 环境:

一、前提准备:

MySQL 5.7 (64位)

Visual Studio 2019 (其他编译器也行,使用 64 位编译,与 MySQL 位数对应即可)

二、引入文件

C语言连接数据库比较繁琐,需要引入关于连接数据库的头文件,依赖等。

问题来了:这些文件都是哪里来的呢?我哪里可以找到这些头文件,依赖。请继续往下看:

找到当时安装MySql的位置:(我的MySQL安装路径: C:\Program Files\MySQL\MySQL Server 5.7) ,会看到如下目录:

所需要的头文件和依赖就在 include 和 lib 文件夹里,复制到与项目主文件同一级目录下即可 。

include 文件夹里全部要复制,不能只复制 mysql.h, 因为mysql.h 需要依赖其它头文件。lib 文件夹里复制 libmysql.dll 和 libmysql.lib 即可。

三、测试代码编写:

#include

#include

#include

/*引入连接Mysql的头文件和lib包*/

#include "mysql/mysql.h"

#pragma comment(lib,"libmysql")

/*定义一些数据库连接需要的宏*/

#define HOST "localhost" /*MySql服务器地址*/

#define USERNAME "root" /*用户名*/

#define PASSWORD "123456" /*数据库连接密码*/

#define DATABASE "rank" /*需要连接的数据库*/

// 执行sql语句的函数

void exeSql(char* sql) {

MYSQL my_connection; /*数据库连接*/

int res; /*执行sql语句后的返回标志*/

MYSQL_RES* res_ptr; /*执行结果*/

MYSQL_ROW result_row; /*按行返回查询信息*/

int row, column; /* 定义行数,列数*/

mysql_init(&my_connection);

if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, DATABASE, 0, NULL, CLIENT_FOUND_ROWS)) {

printf("数据库连接成功!");

/*设置查询编码为 utf8, 支持中文*/

mysql_query(&my_connection, "set names utf8");

res = mysql_query(&my_connection, sql);

if (res) {

/*现在就代表执行失败了*/

printf("Error: mysql_query !\n");

/*不要忘了关闭连接*/

mysql_close(&my_connection);

} else {

/*现在就代表执行成功了*/

/*mysql_affected_rows会返回执行sql后影响的行数*/

printf("%d 行受到影响!\n", mysql_affected_rows(&my_connection));

// 把查询结果装入 res_ptr

res_ptr = mysql_store_result(&my_connection);

// 存在则输出

if (res_ptr) {

// 获取行数,列数

row = mysql_num_rows(res_ptr);

column = mysql_num_fields(res_ptr);

// 执行输出结果,从第二行开始循环(第一行是字段名)

for (int i = 1; i < row + 1; i++) {

// 一行数据

result_row = mysql_fetch_row(res_ptr);

for (int j = 0; j < column; j++) {

printf("%s", result_row[j]);

}

}

}

/*不要忘了关闭连接*/

mysql_close(&my_connection);

}

} else {

printf("数据库连接失败!");

}

}

Linux 环境:

一、前提准备:

MySql 5.7(64位)

c/c++环境(gcc)编译环境

启动 Mysql 服务: sudo service start mysql

二、测试代码编写:

注意:

如果 mysql找不到mysql.h, 可以安装 apt-get install libmysqlclient-dev ,安装完之后,重新进入mysql目录下就有相应的头文件了。Linux 引入mysql.h 就不要像 windows 环境下一样, 直接放在和主文件同一级目录下,而是找到 mysql.h 的位置:/usr/include/mysql/

#include

#include

#include

/*引入连接Mysql的头文件*/

#include "/usr/include/mysql/mysql.h"

/*定义一些数据库连接需要的宏*/

#define HOST "localhost" /*MySql服务器地址*/

#define USERNAME "root" /*用户名*/

#define PASSWORD "123456" /*数据库连接密码*/

#define DATABASE "rank" /*需要连接的数据库*/

// 执行sql语句的函数

void exeSql(char* sql) {

MYSQL my_connection; /*数据库连接*/

int res; /*执行sql语句后的返回标志*/

MYSQL_RES* res_ptr; /*执行结果*/

MYSQL_ROW result_row; /*按行返回查询信息*/

int row, column; /* 定义行数,列数*/

mysql_init(&my_connection);

if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, DATABASE, 0, NULL, CLIENT_FOUND_ROWS)) {

printf("数据库连接成功!");

/*设置查询编码为 utf8, 支持中文*/

mysql_query(&my_connection, "set names utf8");

res = mysql_query(&my_connection, sql);

if (res) {

/*现在就代表执行失败了*/

printf("Error: mysql_query !\n");

/*不要忘了关闭连接*/

mysql_close(&my_connection);

} else {

/*现在就代表执行成功了*/

/*mysql_affected_rows会返回执行sql后影响的行数*/

printf("%d 行受到影响!\n", mysql_affected_rows(&my_connection));

// 把查询结果装入 res_ptr

res_ptr = mysql_store_result(&my_connection);

// 存在则输出

if (res_ptr) {

// 获取行数,列数

row = mysql_num_rows(res_ptr);

column = mysql_num_fields(res_ptr);

// 执行输出结果,从第二行开始循环(第一行是字段名)

for (int i = 1; i < row + 1; i++) {

// 一行数据

result_row = mysql_fetch_row(res_ptr);

for (int j = 0; j < column; j++) {

printf("%s", result_row[j]);

}

}

}

/*不要忘了关闭连接*/

mysql_close(&my_connection);

}

} else {

printf("数据库连接失败!");

}

}

编译程序:gcc -g mysqlconnectDemo.c -lmysqlclient -o test (必须带上 -lmysqlclient)