C/C++ vs2017连接MySQL数据库 - 增删改查(详细步骤)

2023-11-11

在开发中,数据库是必不可少,这篇文章将介绍使用C/C++如何进行连接MySQL数据库,并实现增删改查操作!

注意,此篇文章所讲的是C/C++如何操控MySQL进行简单的、常用的“增删改查”的操作!



一、配置Visual Studio

  1. 找到自己安装MySQL的路径,确保有include和lib两个文件夹
    在这里插入图片描述

  2. 打开创建的Visual Studio项目,切换x64平台
    在这里插入图片描述

    注意:如果你的项目中没有x64平台,请严格按照下面图片的步骤进行操作
    a. 点击下拉框,点击配置管理器
    在这里插入图片描述
    b.在弹出的配置管理器页面,创建一个x64平台,并确定
    在这里插入图片描述
    在这里插入图片描述

    c.将两个平台都切换至x64,关闭即可
    在这里插入图片描述
    关闭后,也许你会发现自己的项目中已经没有生成或者重写生成的功能,这问题不大,不影响正常编译运行代码!

  3. 点击项目,属性
    在这里插入图片描述

  4. 依次点击 配置属性 - VC++目录 - 包含目录 - 编辑,将include路径粘贴于此

    在这里插入图片描述
    在这里插入图片描述

  5. 依次点击 配置属性 - VC++目录 - 库目录 - 编辑,将lib路径粘贴于此
    在这里插入图片描述
    在这里插入图片描述

  6. 依次点击 配置属性 - 链接器 - 输入 - 附加依赖项 - 编辑,再次输入字符串 libmysql.lib

    注意,不是将libmysql.lib的路径复制到这里,是将字符串复制到这里!
    在这里插入图片描述
    在这里插入图片描述

  7. 将lib目录下的libmysql.lib文件复制到C:\Windows\System32目录下
    在这里插入图片描述

请严格按照上面图片的步骤进行操作,否则会出现数据库连接不上的问题!
另外,如果你的项目没有x64平台,而是根据步骤2进行创建的,那么你需要在代码中加入此行代码:

#pragma comment(lib, "libmysql.lib")

以防止连接不上数据库的问题!


二、C/C++连接数据库

操纵数据库所用到的函数:

函数 解析
mysql_init 初始化数据库句柄
mysql_options 设置字符编码
mysql_real_connect 连接数据库
mysql_select_db 选择数据库
mysql_real_query 执行sql语句,成功返回0,失败返回非0
mysql_store_result 获取查询的结果集
mysql_fetch_row 获取查询到的一行数据
mysql_free_result 释放结果集
mysql_close 关闭数据库
mysql_error 获取数据库当前操作失败的原因

操纵数据库所用到的变量类型:

类型 解析
MYSQL 数据库句柄
MYSQL_RES 查询结果集
MYSQL_ROW 记录结果集结构体

当然除了这些,还有许多其他的,但是不常用,我这里列举的都是项目中比较常用的mysql函数;有兴趣的朋友可以自己去了解一下mysql的其他函数!


根据自己的项目需求提前创建好数据库和表:
例如我这里提前创建好了数据库:connect_c_cpp_text
表:student
表的字段设置如下:
在这里插入图片描述


1. 连接数据库 与 选择数据库

bool connectDB(MYSQL &mysql) {
	// 1.初始化数据库句柄
	mysql_init(&mysql);
	
	// 2.设置字符编码
	mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");

	// 3.连接数据库										// 账号	  密码         数据库名
	MYSQL *ret = mysql_real_connect(&mysql, "127.0.0.1", "root", "yang", "connect_c_cpp_text", 3306, NULL, 0);
	if (ret == NULL) {
		printf("数据库连接失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}

	printf("数据连接成功!\n");

	// 选择数据库,成功返回0,失败返回非0
	int res = mysql_select_db(&mysql, "connect_c_cpp_text");
	if (res) {
		printf("选择数据库失败!失败原因%s\n", mysql_error(&mysql));
		return false;
	}

	printf("数据库选择成功!\n");

	return true;
}

2. 插入表数据

根据自己的表字段进行设置sql语句,再执行即可!

bool addTableData(int id, char *name, int age, char *sex) {
	MYSQL mysql;			// 数据库句柄
	char sql[SQL_MAX];		// 存储sql语句

		// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言字符串组合
	snprintf(sql, SQL_MAX, "INSERT INTO student VALUES(%d, '%s', %d, '%s');", id, name, age, sex);
	printf("插入sql语句:%s\n", sql);
	// 如果id字段用了auto_increment进行修饰,那么可以使用以下数据库语句:
	// snprintf(sql, SQL_MAX, "INSERT INTO student(name, age, sex) VALUES('%s', %d, '%s');", name, age, sex);

	// 执行sql语句,成功返回0
	//int ret = mysql_query(&mysql, sql);		
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));		
	printf("执行插入语句,插入返回结果:%d\n", ret);

	if (ret) {
		printf("插入表数据失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}
	printf("插入表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}

3. 删除表数据

根据自己的表字段进行设置sql语句,再执行即可!

bool delTableData(int id) {
	MYSQL mysql;			// 数据库句柄
	char sql[SQL_MAX];		// 存储sql语句

		// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言字符串组合
	snprintf(sql, SQL_MAX, "DELETE FROM student WHERE id = %d;", id);
	printf("删除sql语句:%s\n", sql);

	// 执行sql语句,成功返回0
	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行删除语句,插入返回结果:%d\n", ret);

	if (ret) {
		printf("删除表数据失败!失败原因:%s\n", mysql_error(&mysql));
		return false;

	}
	printf("删除表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}

4. 修改表数据

根据自己的表字段进行设置sql语句,再执行即可!

bool altTableData(int id, int age) {
	MYSQL mysql;		// 数据库句柄
	char sql[SQL_MAX];	// sql语句

	// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言组合字符串
	snprintf(sql, SQL_MAX, "UPDATE student SET age = %d WHERE id = %d;", age, id);
	printf("修改sql语句:%s\n", sql);

	// 执行sql语句,成功返回0
	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行修改语句,修改返回结果:%d\n", ret);

	if (ret) {
		printf("数据修改失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}

	printf("修改表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}

5. 查询表数据

根据自己的表字段进行设置sql语句,再执行即可!

bool queTableData() {
	MYSQL mysql;		// 数据库句柄
	MYSQL_RES* res;		// 查询结果集
	MYSQL_ROW row;		// 记录结构体
	char sql[SQL_MAX];	// SQL语句

	// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言组合字符串
	snprintf(sql, SQL_MAX, "SELECT id, name, age, sex FROM student;");
	printf("查询sql语句:%s\n", sql);

	// 查询数据
	//int ret = mysql_query(&mysql, "select * from student;");		// 等效于下面一行代码
	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行查询语句,查询返回结果:%d\n", ret);

	if (ret) {
		printf("数据查询失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}
	printf("数据查询成功!\n");
	


	// 获取结果集
	res = mysql_store_result(&mysql);

	// 获取查询到的一行数据
	// 给row赋值,判断row是否为空,不为空就打印数据。
	while (row = mysql_fetch_row(res)) {
		printf("%d  ", atoi(row[0]));	// 转换为int类型,打印id
		printf("%s  ", row[1]);			// 打印姓名
		printf("%d  ", atoi(row[2]));	// 转换为int类型,打印年龄
		printf("%s  \n", row[3]);		// 打印性别
	}

	// 释放结果集
	mysql_free_result(res);

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}

全部测试代码:

#include <stdio.h>
#include <mysql.h> // mysql文件

#define SQL_MAX 256		// sql语句字符数组最大值


// 连接数据库
static bool connectDB(MYSQL &mysql);
// 插入数据
bool addTableData(int id, char *name, int age, char *sex);
// 删除数据
bool delTableData(int id);
// 修改数据
bool altTableData(int id, int age);
// 查询数据
bool queTableData();

int main(void) {
	delTableData(1);

	addTableData(1, (char *)"小明", 20, (char *)"男");

	altTableData(1, 22);

	queTableData();

	return 0;
}


/*****************************************************
 * 功能:连接connect_c_cpp_text数据库,并选择数据库
 *
 * 参数:
 *			mysql - 数据库句柄
 *
 * 返回值:
 *			连接成功返回true,连接失败返回false
 *****************************************************/
bool connectDB(MYSQL &mysql) {
	// 1.初始化数据库句柄
	mysql_init(&mysql);
	
	// 2.设置字符编码
	mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");

	// 3.连接数据库
	MYSQL *ret = mysql_real_connect(&mysql, "127.0.0.1", "root", "yang", "connect_c_cpp_text", 3306, NULL, 0);
	if (ret == NULL) {
		printf("数据库连接失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}

	printf("数据连接成功!\n");

	// 选择数据库
	int res = mysql_select_db(&mysql, "connect_c_cpp_text");
	if (res) {
		printf("选择数据库失败!失败原因%s\n", mysql_error(&mysql));
		return false;
	}

	printf("数据库选择成功!\n");

	return true;
}


/****************************************************
 * 功能:向student表中插入一条记录
 * 
 * 参数:
 *			id	 - 对应表字段id,编号
 *			name - 对应表字段name,姓名
 *			age	 - 对应表字段age,年龄
 *			sex	 - 对应表字段sex,性别
 *
 * 返回值:
 *			插入成功返回true,插入失败返回false
 ****************************************************/
bool addTableData(int id, char *name, int age, char *sex) {
	MYSQL mysql;			// 数据库句柄
	char sql[SQL_MAX];		// 存储sql语句

		// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言字符串组合
	snprintf(sql, SQL_MAX, "INSERT INTO student VALUES(%d, '%s', %d, '%s');", id, name, age, sex);
	printf("插入sql语句:%s\n", sql);
	// 如果id字段用了auto_increment进行修饰,那么可以使用以下数据库语句:
	// snprintf(sql, SQL_MAX, "INSERT INTO student(name, age, sex) VALUES('%s', %d, '%s');", name, age, sex);

	// 执行sql语句,成功返回0
	//int ret = mysql_query(&mysql, sql);		
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));		
	printf("执行插入语句,插入返回结果:%d\n", ret);

	if (ret) {
		printf("插入表数据失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}
	printf("插入表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}

/*****************************************************
 * 功能:删除student表中id字段等于参数id的记录
 *
 * 参数:
 *			id - 对应表字段id,编号
 *
 * 返回值:
 *			删除成功返回true,删除失败返回false
 *****************************************************/
bool delTableData(int id) {
	MYSQL mysql;			// 数据库句柄
	char sql[SQL_MAX];		// 存储sql语句

		// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言字符串组合
	snprintf(sql, SQL_MAX, "DELETE FROM student WHERE id = %d;", id);
	printf("删除sql语句:%s\n", sql);

	// 执行sql语句,成功返回0
	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行删除语句,插入返回结果:%d\n", ret);

	if (ret) {
		printf("删除表数据失败!失败原因:%s\n", mysql_error(&mysql));
		return false;

	}
	printf("删除表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}


/******************************************************
 * 功能:根据参数id,修改对应表记录的年龄为参数age
 *
 * 参数:
 *			id	- 对应表字段id,编号
 *			age - 对应表字段age,年龄
 *
 * 返回值:
 *			修改成功返回true,修改失败返回false
 *******************************************************/
bool altTableData(int id, int age) {
	MYSQL mysql;		// 数据库句柄
	char sql[SQL_MAX];	// sql语句

	// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言组合字符串
	snprintf(sql, SQL_MAX, "UPDATE student SET age = %d WHERE id = %d;", age, id);
	printf("修改sql语句:%s\n", sql);

	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行修改语句,修改返回结果:%d\n", ret);

	if (ret) {
		printf("数据修改失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}

	printf("修改表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}


/********************************************************
 * 功能:查询student表中所有数据记录,并输出至控制台
 * 
 * 参数:
 *			无
 *
 * 返回值:
 *			查询成功返回true,查询失败返回false
 ********************************************************/
bool queTableData() {
	MYSQL mysql;		// 数据库句柄
	MYSQL_RES* res;		// 查询结果集
	MYSQL_ROW row;		// 记录结构体
	char sql[SQL_MAX];	// SQL语句

	// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言组合字符串
	snprintf(sql, SQL_MAX, "SELECT id, name, age, sex FROM student;");
	printf("查询sql语句:%s\n", sql);

	// 查询数据
	//int ret = mysql_query(&mysql, "select * from student;");		// 等效于下面一行代码
	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行查询语句,查询返回结果:%d\n", ret);

	if (ret) {
		printf("数据查询失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}
	printf("数据查询成功!\n");
	


	// 获取结果集
	res = mysql_store_result(&mysql);

	// 获取查询到的一行数据
	// 给row赋值,判断row是否为空,不为空就打印数据。
	while (row = mysql_fetch_row(res)) {
		printf("%d  ", atoi(row[0]));	// 转换为int类型,打印id
		printf("%s  ", row[1]);			// 打印姓名
		printf("%d  ", atoi(row[2]));	// 转换为int类型,打印年龄
		printf("%s  \n", row[3]);		// 打印性别
	}

	// 释放结果集
	mysql_free_result(res);

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}


总结
只是简单的写下了C/C++连接数据和和操纵数据库的代码,并没有对其中函数和变量进行讲解;都有注释,自己看吧,看不懂再评论提问吧!

另外,上面sql语句的关键我都使用了大写,为什么呢?就是为了区分作用,使得很好检查sql语句的语法错误!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++ vs2017连接MySQL数据库 - 增删改查(详细步骤) 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 世界上最大的开源基金会 Apache 是如何运作的?

    整理 苏宓 出品 CSDN ID CSDNnews 开源软件的发展势如破竹 全球各国的许多开源技术登上国际舞台 成为数以万计开发者协作 共享 共进的基石 在欣欣向荣态势下 也离不开遵循公开 透明 开放等理念的开源基金会的主导与治理 作为世界
  • 服务器时间如何修改

    win R 输入 gpedit msc 配置NtpServer time nist gov 正常就可以同步了 还没同步就执行下面的 更新组策略 命令行执行gpupdate force 重启 windows time 如果还没有同步 把上面的
  • mac 自带java 环境变量_Mac 安装JDK及环境变量配置

    1 先安装jkd Mac 的jdk系统有自带 如果没有用过的话 版本可能太低 需要重新下载较高的版本 1 终端查看当前安装的jdk版本号 java version 终端查看jdk版本号 2 下载JDK 1 访问Oracle官网 https
  • c++保存图标到dll_[LAB]一种无痕Dll模块注入方式

    0x00 前言 方式 CreateRemoteThread 需要 visual studio 2015 需要 进程模块查看器 如 PCHunter ProcessHacker 等 需要 创建一个用于实验注入的 MFC项目 窗体 需要 创建一
  • git clone出现fatal: Could not read from remote repository解决办法

    一 问题描述 在git clone一个项目时出现如下报错 第一个选项 问你是否继续连接 输入yes然后回车 The authenticity of host github com 20 205 243 166 can t be establ
  • 计算机考试选择题有多选嘛,期货从业资格考试综合题是单选还是多选题?

    期货从业考试采取闭卷 计算机考试方式 所有试题均为客观选择题 每科试题量为140道 满分100 60分为及格 每科考试多场次组织 单科考试时间为100分钟 期货从业资格考试科目考试时间均为100分钟 所有试题均为客观选择题 满分100分 6
  • Java substring( )

    substring start stop substring start stop 用于提取从start到stop 1之间的所有字符 所取字符长度为stop start start 非负整数 开始提取字符的起始位置 必需要写 stop 非负
  • 【教程】Win10安装SQLServer2005出现服务启动失败的问题解决

    Win10安装SQLServer2005时需要注意以下几点 1 先在控制面板中安装好IIS 2 右键SQLServer2005安装文件夹中的setup exe 设置兼容模式为Win7兼容模式 且以管理员身份运行 3 安装过程中 遇到弹窗提示
  • Windows 下最实用的 Gvim 配置

    一直以来被称为编辑器之神的 vim 在 Windows 下很难发挥其强大的功能 本文从实用的角度阐述如何调校出一个比较好用的 vim 不过仍然要说明下 在众多 vim 构建版本中 Mac OS 平台的 MacVim 是我认为最好用的一个版本
  • Android基础小知识

    一 TextView的hint与wrap content 二 tools context tools text等作用 tools context tools text等不会被打包进apk 只是用来在布局时候预览渲染效果的 tools con
  • 阿里云爆发史上最严重宕机事故。。。

    阿里云香港区于2022年12月18日出现故障 多个香港和澳门的网站受到影响 包括Linux中国的官网 https linux cn 澳门金融管理局 澳门银河 莲花卫视 澳门水泥厂等关键基础设施营运者的网站 澳觅和MFood等外卖平台 以及澳
  • FileReader简介

    前言 FileReader是一种异步文件读取机制 结合input file可以很方便的读取本地文件 input file 在介绍FileReader之前 先简单介绍input的file类型
  • Chrome插件链接

    常用Chrome插件整理 其它好用的插件 欢迎大家留言分享 输入ID下载点击下载 1 已安装插件里可以查看ID 2 安装链接里面也有 https chrome google com webstore detail idm integrati
  • vivado烧录程序搜索不到设备,烧录卡住不动

    烧录程序找不到设备或者设备不可用 烧录过程卡主不动 可以排除驱动问题的前提 解决方法 1 先观察jtag的指示灯 红灯有问题 可能fpga电源未开 接口松动 观察板子的初始程序是否启动成功 如果没有启动成功 jtag指示器也会是绿的 但是搜
  • springboot 过滤器异常处理,filter exception catch

    参考地址 java How to manage exceptions thrown in filters in Spring Stack Overflow
  • 经验积累①:关于设备程序的版本迭代方案详解

    关于设备程序的版本迭代方案详解 一 案例描述 对于嵌入式应用层来说 需要对设备的很多参数进行保存 为了使得这些配置参数掉电不丢失 因此在flash中生成配置文件用于保存设备参数 每当设备重启后 将参数读出 重发给设备 由于生成了可变的配置文
  • event_base_loop

    函数 int event base loop struct event base int 等待事件被触发 然后调用它们的回调函数 这是 event base dispatch的更灵活版本 默认情况下 这个循环会一直运行 直到没有添加的事件
  • 在macOS下安装和配置MySQL数据库

    一 到社区下载安装包 官网地址 MySQL MySQL Community Downloadshttps dev mysql com downloads MySQL Download MySQL Community Serverhttps
  • 身边的逻辑学——过度概括(1)

    过度概括 overgeneralization 概括与过度概括有何不同 概括知识是暂定的 因为它基于对经验的概括 原则上 下一个经验很可能出乎你的意料之外 使你 我们每个人 不得不对先前概括得出的结论感到怀疑 了解概括的本质有助于发现真理
  • C/C++ vs2017连接MySQL数据库 - 增删改查(详细步骤)

    在开发中 数据库是必不可少 这篇文章将介绍使用C C 如何进行连接MySQL数据库 并实现增删改查操作 注意 此篇文章所讲的是C C 如何操控MySQL进行简单的 常用的 增删改查 的操作 目录 一 配置Visual Studio 二 C