在开发中,数据库是必不可少,这篇文章将介绍使用C/C++如何进行连接MySQL数据库,并实现增删改查操作!
注意,此篇文章所讲的是C/C++如何操控MySQL进行简单的、常用的“增删改查”的操作!
一、配置Visual Studio
-
找到自己安装MySQL的路径,确保有include和lib两个文件夹
-
打开创建的Visual Studio项目,切换x64平台
注意:如果你的项目中没有x64平台,请严格按照下面图片的步骤进行操作
a. 点击下拉框,点击配置管理器
b.在弹出的配置管理器页面,创建一个x64平台,并确定
c.将两个平台都切换至x64,关闭即可
关闭后,也许你会发现自己的项目中已经没有生成或者重写生成的功能,这问题不大,不影响正常编译运行代码! -
点击项目,属性
-
依次点击 配置属性 - VC++目录 - 包含目录 - 编辑,将include路径粘贴于此
-
依次点击 配置属性 - VC++目录 - 库目录 - 编辑,将lib路径粘贴于此
-
依次点击 配置属性 - 链接器 - 输入 - 附加依赖项 - 编辑,再次输入字符串 libmysql.lib
注意,不是将libmysql.lib的路径复制到这里,是将字符串复制到这里!
-
将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 | 数据库句柄 |
MYSQL_RES | 查询结果集 |
MYSQL_ROW | 记录结果集结构体 |
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);
// 执行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);
// 执行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语句的语法错误!
转载:https://blog.csdn.net/cpp_learner/article/details/116171955