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

相关推荐
ejinxian1 小时前
PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等数据库
数据库·mysql·mongodb
玖玥拾8 小时前
C/C++ 基础笔记(十四)多态与模板编程
c语言·c++·多态·模板
大白要努力!9 小时前
MySQL 8.0 + Navicat 完整操作指南
数据库·mysql
云絮.10 小时前
数据库操作
数据库·mysql·算法·oracle
设计师小聂!11 小时前
宝塔 Linux 面板保姆级教程
linux·mysql·开源·运维开发
caimouse12 小时前
Reactos 第1章 概述
c语言·开发语言·架构
Tong Z13 小时前
Mysql DDL中的ALGORITHM
数据库·mysql
啊森要自信13 小时前
【GUI自动化测试】控件、鼠标键盘操作与多场景自动化
c语言·开发语言·python·adb·ipython
李白的天不白14 小时前
查找容器IP
sql
lpl31290550915 小时前
skynet 共享数据原理
服务器·c语言·lua