前言:

前阵子接了一单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


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐