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 语言接口的内容,读者请自行拓展学习。

相关推荐
lllsure3 分钟前
MySQL总结
数据库·mysql
DdddJMs__1359 分钟前
C语言 | Leetcode C语言题解之第458题可怜的小猪
c语言·leetcode·题解
weixin_5318042443 分钟前
SQL优化技巧(如查询优化、索引优化)。分布式系统的基本概念及挑战(如数据一致性、服务发现、负载均衡)
数据库·sql·服务发现
凯子坚持 c1 小时前
C语言复习概要(四)
c语言·开发语言
szial2 小时前
深入理解SQL模糊查询中的特殊字符处理——以DB2为例
数据库·sql
肥or胖2 小时前
【MySQL】索引
linux·数据库·mysql
青云交2 小时前
大数据新视界 --大数据大厂之数据质量评估指标与方法:提升数据可信度
大数据·sql·一致性·完整性·数据质量评估·数据可信度·准确性·时效性
Bruce_Li_Q3 小时前
C语言贪吃蛇
c语言·开发语言
马浩同学3 小时前
【ESP32】Arduino开发 | Timer定时器+定时器闹钟例程
c语言·单片机·嵌入式硬件·mcu
Beginner_bml3 小时前
C语言---链表
c语言·数据结构