一、介绍
用C++程序实现了一个简单的图书馆借阅管理系统
为了方便存储管理数据 使用了MySQL数据库 MySQL服务器部署在腾讯云Linux上
利用API编程技术 使得C++程序访问控制MySQL
二、环境配置
使用VS2019的开发环境
项目调试属性中配置如图
以上两张图是MySQL数据库开发必须做的配置
包含MySQL必要的头文件和库文件 添加链接器的附加依赖项
此外 为了使得本地开发的程序可以在他人无任何开发环境的电脑上正常运行
还需进行以下配置
管理器设置为Release X64 (MySQL开发应使用X64架构)
设置在静态库中使用MFC 运行库设置为多线程MT
三、连接数据库
开发C++程序访问控制MySQL服务器有固定的步骤和规律
第一步 引入头文件 创建三个变量
#include<mysql.h>
MYSQL mysql;
MYSQL_RES* res;
MYSQL_ROW row;
MYSQL变量类型 可以理解为一个MySQL实例 这个mysql变量就是待会要互动的数据库
MYSQL_RES* MYSQL_ROW 这两个变量类型是用来获取数据库查询结果的 后面介绍
第二步 连接数据库
int main()
{
mysql_init(&mysql);
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
if (!mysql_real_connect(&mysql, "IP", "登录用户", "登录密码", "数据库名", 3306, NULL, 0))
{
printf("错误原因:%s\n", mysql_error(&mysql));printf("连接失败!\n");
}
else cout << "连接数据库成功!" << endl;
mysql_close(&mysql);
return 0;
}
mysql_init(&mysql); 初始化数据库
mysql_options(&mysql,...); 设置数据库字符编码
mysql_real_connect(&mysql,...); 正式建立连接
这三个函数 可以理解为连接MySQL的固定步骤
其中mysql_error(&mysql);可以获取最近一次错误的原因
四、API访问数据库
通过C++程序访问控制MySQL最关键的一点是
如何在C++开发环境中编写SQL语句
个人习惯的方式是
char sql[256];
snprintf(sql, 256, "SQL语句");
mysql_query(&mysql, sql);
三行命令作为一个组合
1.创建一个字符串数组
2.snprintf向字符串数组中写入SQL语句
3.mysql_query(&mysql,sql);意味着在数据库中执行了 对应的SQL语句
较为复杂一点的例子
执行insert插入语句 向history这个表中添加一条数据
char sql[256];
string person_name, book_name, section;
cout << "输入借书人姓名(输错了就关闭程序重开吧)" << endl;cin >> person_name;
cout << "输入借书人所属部门" << endl;cin >> section;
cout << "输入借出书本的编码" << endl;cin >> book_name;
snprintf(sql, 256, "insert into history (person_name,book_name,section,borrow_time) values ('%s','%s','%s',curdate())", person_name.c_str(), book_name.c_str(), section.c_str());
mysql_query(&mysql, sql);
这里使用了string类 要注意的是 对应参数要用C字符串数组的格式
snprintf(sql, 256, "insert into history (person_name,book_name,section,borrow_time) values ('%s','%s','%s',curdate())", person_name.c_str(), book_name.c_str(), section.c_str());
一个.c_str()对应前面一个'%s'
需要注意的细节
如何获取通过select语句从数据库查询到的结果呢
这个时候就要用到 MYSQL_RES* MYSQL_ROW 类型 对应 res row变量
举个查询的例子
char sql[256];
snprintf(sql, 256, "select * from books where id = '%s' ", book_name.c_str());
mysql_query(&mysql, sql);
res = mysql_store_result(&mysql);
row = mysql_fetch_row(res);
int num = atoi(row[0]);
mysql_free_result(res);
如果是之前介绍的插入语句
那么执行 char sql snprintf mysql_query 这三行命令就完事了
但是如果是要返回数据的
就有后面的
res = mysql_store_result(&mysql);
row = mysql_fetch_row(res);
res变量通过mysql_store_result(&mysql)获取查询结果
row变量通过mysql_fetch_row(res);获得每一条具体的查询信息(每一行信息)
row[0] row[1] row[2] ... 对应每一条信息的每一个值
由于返回的全部是字符串类型 若要获得数值 可以使用atoi()函数
为了实现具体的需求 我们可以通过VS中的断点调试看看res变量和row变量里到底是啥
注意:如果遇到打了断点却不停止的情况 可以关闭C++优化 把O1或O2改为Od
比如 分析发现res->row_count是查询到的信息条数
那么我们可以通过写if语句分析row_count的值 判断有没有查到结果
此外 一次 res=mysql_store_result(&mysql);的使用
就要对应一次 mysql_free_result(res);
不然下一次mysql_query(&mysql);可能引发错误
小技巧:
while (row = mysql_fetch_row(res))cout << row[0] << ' ' << row[1] << endl;
利用while循环可以逐行一条一条输出所有结果
五、如何在他人电脑上运行程序
如何在没有任何开发环境的电脑上运行程序?
对方没有安装MySQL或VS的任何版本
测试发现 对方运行程序时缺少MySQL相关的动态链接库(.dll文件)
尽管我们设置好了静态库中使用MFC 多线程MT
我的解释:
控制MySQL的C++程序确实是静态编译
但是我的程序逻辑只是通过API编程 只是写了接口的调用
接口的具体实现与运作还是要依赖MySQL相关动态链接库
综上:
VS2019中 CTRL+F5 编译完成后
进入工程文件路径 找 X64/Release 只保留以下文件即可(其他的都可以删除)
注意需要手动复制相关动态链接库文件到.exe同级目录下
把这个文件夹打包发给别人 就可用了