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

相关推荐
whoarethenext4 分钟前
使用 C/C++ 和 OpenCV 提取图像的感兴趣区域 (ROI)
c语言·c++·opencv
凌肖战20 分钟前
力扣上C语言编程题:最大子数组和(涉及数组)
c语言·算法·leetcode
意疏3 小时前
深入解析MySQL Join算法原理与性能优化实战指南
mysql·算法·性能优化
fictionist3 小时前
动态 Web 开发技术入门篇
java·服务器·开发语言·笔记·学习·mysql·spring
SY师弟4 小时前
台湾TEMI协会竞赛——1、龙舟机器人组装教学
c语言·单片机·嵌入式硬件·机器人·嵌入式·台湾temi协会
SeaTunnel4 小时前
如何将SeaTunnel MySQL-CDC与Databend 高效整合?格式与方案全解析
数据库·mysql·开源·数据集成·seatunnel·databend
学习噢学个屁4 小时前
基于STM32音频频谱分析设计
c语言·stm32·单片机·嵌入式硬件·音视频
顾三殇4 小时前
【自考】《计算机信息管理课程实验(课程代码:11393)》华师自考实践考核题型解析说明:C++ 与 mysql 实践题型与工具实践题分析
c++·mysql·华师自考实践考核题型分析
xiaolyuh1234 小时前
基于binlog恢复误删除MySQL数据
数据库·mysql