C语言连接MySQL并执行SQL语句(hello world)

1. 新建一个控制台项目

参考【VS2022 和 VS2010 C语言控制台输出 Hello World】VS2022 和 VS2010 C语言控制台输出 Hello World_vs2022源文件在哪_西晋的no1的博客-CSDN博客

2. 安装 MySQL

参考【MySQL 8.0.34安装教程】MySQL 8.0.34安装教程_西晋的no1的博客-CSDN博客

3. 复制 MySQL 库文件到项目文件中

在MySQL的安装文件夹下看到 include 文件夹和 lib 文件夹。将 include 文件夹和 lib 文件夹以及其内的文件全部复制到项目文件夹中(demo.cpp同文件夹下),将lib 文件夹下的libmysql.dll文件复制一份到项目文件夹中(demo.cpp同文件夹下)。

其中,include 文件夹下存放的是头文件(方法的声明),lib 文件夹下存放的是动静态库(方法的实现,打包成库)。

4. 新建一个 "stdbool.h" 文件,内容如下,将该文件复制到项目文件夹中

本步骤目的是解决vs编译出错:fatalerrorc1083:无法打开包括文件:"stdbool.h":nosuchfileordirectory(代码片段)。

"stdbool.h"文件内容如下:

cpp 复制代码
/*
 * ISO C Standard:  7.16  Boolean type and values  <stdbool.h>
 */
 
#ifndef __STDBOOL_H__
#define __STDBOOL_H__
#define bool	int
#define true	1
#define false	0
#endif
/* __STDBOOL_H__ */

"stdbool.h"文件放于项目文件夹中的include 文件夹下。

5. 进行调用库的配置

注意,下述所有配置,需要先选择与MySQL库对应的平台 win32 或 x64,否则会出错。

如下:

error LNK2019: 无法解析的外部符号 _mysql_real_connect@32,该符号在函数 _main 中被引用

error LNK2019: 无法解析的外部符号 _mysql_query@8,该符号在函数 _main 中被引用

error LNK2019: 无法解析的外部符号 _mysql_init@4,该符号在函数 _main 中被引用

error LNK2019: 无法解析的外部符号 _mysql_close@4,该符号在函数 _main 中被引用 等错误的时候,是因为vs项目的位数与MySQL库的位数不匹配。

可以更改项目属性,项目属性要改两个地方(注意同步修改对应平台下的 库配置):

(1)项目属性-->【配置属性】-->【VC++目录】-->【包含目录】:选择mysql库中头文件所在目录

项目文件夹include文件夹

C:\Program Files\MySQL\MySQL Server 8.0\include

(2)项目属性-->【配置属性】-->【VC++目录】-->【库目录】:选择mysql库中静态库所在目录

项目文件夹lib文件夹

C:\Program Files\MySQL\MySQL Server 8.0\lib

(3)项目属性-->【配置属性】-->【链接器】-->【输入】-->【附加依赖项】

添加libmysql.lib。

6. 示例代码 1- 检验 MySQL 库配置和调用是否成功

将下述代码覆盖demo.cpp中的内容。

cpp 复制代码
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
int main()
{

	MYSQL*mysql=mysql_init(0);
	system("pause");
	return 0;
}

上述代码编译成功,说明配置成功。运行成功,说明MySQL库调用成功。

7. 示例代码 2- 获取 MySQL 客户端版本

将下述代码覆盖demo.cpp中的内容。

cpp 复制代码
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
int main()
{

	//获取客户端的版本信息
    printf("mysql client version:%s\n", mysql_get_client_info());
	system("pause");
	return 0;
}

8. 示例代码 3- 查询 orderitems 表中的数据并进行打印输出

这个示例需要的前置条件比较多:1.一个数据库;2.数据库中有表;3.表中有数据;4.具有读写数据库权限的用户等。

cpp 复制代码
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>

const char host[] = "127.0.0.1";	// MySQL所在机器的ip
const int port = 0;					// MySQL所在机器的端口
const char db[] = "test";			// 数据库名
const char user[] = "root";			// 用户名
const char passwd[] = "test123";	// 用户密码

int main()
{
	//1、获取MySQL实例(相当于创建了一个MySQL句柄)
	MYSQL* ms = mysql_init(nullptr);

	//2、连接数据库
	if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {
		printf("数据库连接失败!\n");
		return 1;
	}
	printf("数据库连接成功!\n");
	mysql_set_character_set(ms, "utf8"); //设置编码格式为utf8

	//3、查询数据库表中的记录

	//a、执行查询语句
	char sql[] = "select * from orderitems;";
	if(mysql_query(ms, sql) != 0) {
		printf("查询数据失败!\n");
		return 2;
	}
	printf("查询数据成功!\n");
	//b、获取查询结果
	MYSQL_RES* res = mysql_store_result(ms);
	int rows = mysql_num_rows(res); //行数
	int cols = mysql_num_fields(res); //列数
	//获取每列的属性并打印列名
	MYSQL_FIELD* fields = mysql_fetch_fields(res);
	for(int i = 0;i < cols;i++) printf("%s\t", fields[i].name);
	printf("\n");

	for(int i = 0;i < rows;i++) {
		//获取一行数据并进行打印
		MYSQL_ROW row = mysql_fetch_row(res);
		for(int j = 0;j < cols;j++) {
			printf("%s\t", row[j]);
		}
		printf("\n");
	}
	
    mysql_free_result(res); // 释放内存空间

	//4、关闭数据库
	mysql_close(ms);
	printf("数据库关闭成功!\n");
	return 0;
}

写在最后:本文仅展示了使用MySQL库的基础内容,并未介绍过多MySQL 的 C 语言接口的内容,读者请自行拓展学习。

相关推荐
feifeigo1233 小时前
升级到MySQL 8.4,MySQL启动报错:io_setup() failed with EAGAIN
数据库·mysql·adb
森焱森3 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
双力臂4046 小时前
MyBatis动态SQL进阶:复杂查询与性能优化实战
java·sql·性能优化·mybatis
small_wh1te_coder7 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
A__tao8 小时前
一键将 SQL 转为 Java 实体类,全面支持 MySQL / PostgreSQL / Oracle!
java·sql·mysql
一只fish8 小时前
MySQL 8.0 OCP 1Z0-908 题目解析(17)
数据库·mysql
A__tao9 小时前
SQL 转 Java 实体类工具
java·数据库·sql
叁沐10 小时前
MySQL 06 全局锁和表锁:给表加个字段怎么有这么多阻碍?
mysql
power 雀儿11 小时前
集群聊天服务器---MySQL数据库的建立
服务器·数据库·mysql
黑听人11 小时前
【力扣 简单 C】70. 爬楼梯
c语言·leetcode