前言:
前阵子接了一单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 <stdio.h>
#include <string.h>
#include <stdlib.h>
/*引入连接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 <stdio.h>
#include <string.h>
#include <stdlib.h>
/*引入连接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
)