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数据库 - 增删改查(详细步骤) 的相关文章

  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何修改现有表以添加时区

    我有一个包含 500 多个表的大型应用程序 我必须将应用程序转换为时区感知 当前应用程序使用new java util Date GETDATE 与服务器的时区 即没有任何时区支持 我已将这项任务分为几个步骤 以便于开发 我确定的第一个步骤
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 世界上最大的开源基金会 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