数据库系统 图书管理系统 C语言
1. 实验环境配置
实验所需环境:Visual Studio 2022以及MySQL.
配置环境过程:
-
下载并安装MySQL。
-
下载并安装Navicat Premium使SQL可视化更方便。
-
将VS和MySQL进行连接,步骤如下:
-
打开项目属性
-
C/C++—常规—附加包含目录—添加MySQL include路径
(注意这里的路径是你安装mysql时候的路径)
-
连接器—常规—附加库目录—添加lib路径
-
链接器—输入—附加依赖项—添加libmysql.lib
-
后续在代码中添加
#include "mysql.h"
即可使用MySQL库。
-
2. mysql.h库函数解析
参考:(1条消息) C++ 连接数据库代码_Mr.禾的博客-CSDN博客_c++连接数据库代码
mysql_init
获得或初始化一个MYSQL结构。
mysql_real_connect
连接一个MySQL服务器。
mysql_query
执行指定为一个空结尾的字符串的SQL查询。
需要注意的是,返回0是执行成功,返回1是执行失败。
后续的每一个具体模块都是通过此函数在MySQL中执行语句,需要实现的就是创建MySQL语句字符串即可,需要注意字符串结尾不是;
而是\0
。
mysql_store_result
检索一个完整的结果集合给客户。
需要注意的是,本函数可能返回空值,因此在判断select是否有返回值时,需要判断返回的字符串是否为nullptr。
mysql_query(&mysql, "set names gbk")
防止中文查询结果乱码。
mysql_query(&mysql, "SET CHARACTER SET GBK")
保证插入成功。
在实际设计中,创建符合MYSQL语法的query语句(结尾为’\0’),然后使用mysql_query函数执行该语句。
3. 具体实现
3.1 数据库连接
bool ConnectDatabase() {
mysql_init(&mysql);
const char host[] = "localhost";//在本地创建的数据库
const char table[] = "library";//数据库的名称
const char user[] = "root";//设置的登录用户名
const char psw[] = "111111";//设置的登录密码
const int port = 3306;//端口
//使用库函数mysql_real_connect进行数据库连接
if (!(mysql_real_connect(&mysql, host, user, psw, table, port, NULL, 0))) {
printf("连接失败!!\n");
return false;
}
else {
printf("成功连接~\n");
return true;
}
}
3.2 查询语句实现(以管理员登录为例)
SA存储在library数据库的SA表中,包含ID和pas等信息。
若能够成功的管理员登陆,即为在SA表中含有输入的ID和密码组合,那么成功登录。
bool login() {
int choice;
choice = 0;
do {
printf("请选择登录模式:1 普通用户 2 管理员 -1 退出\n");
scanf("%d", &choice);
if (choice == 1) {
return false;
}
else if (choice == 2) {
char pass[30];
printf("请输入编号:");
scanf("%s", &user);
printf("请输入密码:");
scanf("%s", &pass);
//创建query语句
strcpy(query, "select * from sa where id = ");
strcat(query, user);
strcat(query, " and pas = '");
strcat(query, pass);
strcat(query, "'");
mysql_query(&mysql, "set names gbk");
mysql_query(&mysql, query);
char* str_field[32]; //定义一个字符串数组存储字段信息
res = mysql_store_result(&mysql);
for (int i = 0; i < 4; i++) //在已知字段数量的情况下获取字段名
{
str_field[i] = mysql_fetch_field(res)->name; //返回一个所有字段结构的数组。
}
//打印获取的数据
column = mysql_fetch_row(res); //在已知字段数量情况下,获取并打印下一行
//如果是空值,即没有这个SA,可能是账号密码输错了
if (column==nullptr) {
printf("请检查输入的账号密码或重新选择登录模式!!\n");
continue;
}
else {
printf("登陆成功~\n");
return true;
}
}
} while (choice != -1);
}
3.3 插入/删除语句实现
void insertbook() {
int num;
printf("请输入你要插入的书的个数:");
scanf("%d", &num);
char query[1000];
char values[100];
getchar();
int i;
for (i = 0; i < num; i++) {
gets_s(values);
mysql_query(&mysql, "SET CHARACTER SET GBK");
strcpy(query, "INSERT INTO book values");
strcat(query, values);
if (mysql_query(&mysql, query)) {
printf("插入成功!\n");
}
else {
printf("第%d条数据插入失败,请检查。\n", i + 1);
}
}
}
输入的信息文件类似:
(101,'摄影','绘画、摄影、电影','华中科技大学出版社',2021,'拉兹洛·莫霍利-纳吉',49.80,1,1)
(102,'摄影','新视觉 : 从材料到建筑','重庆大学出版社',2020,'拉兹洛·莫霍利-纳吉',38.00,2,2)
(103,'摄影','森山大道','北京美术摄影出版社',2017,'森山大道',98.00,2,2)
(104,'摄影','电视摄像','上海交通大学出版社',2018,'滕方',56.00,1,1)
(105,'摄影','拍出电影感','九州出版社',2021,'屠明非',180.00,1,1)
(106,'摄影','摄影曝光','浙江摄影出版社',2020,'屠明非',48.00,1,0)
(107,'摄影','风光的超越 : 摄影的审美探索','浙江摄影出版社',2020,'戴维·沃德',55.00,3,3)
(108,'摄影','风光的内在 : 摄影师的洞察力与灵感','浙江摄影出版社',2017,'戴维·沃德',55.00,1,1)
(109,'建筑','高层建筑结构设计','武汉大学出版社',2021,'白国良',58.00,2,1)
(110,'建筑','江南传统建筑文化及其对当代建筑创作思维的启示','东南大学出版社',2020,' 陈鑫',78.00,2,2)
(111,'建筑','意大利古建筑散','清华大学出版社',2021,'陈志华',68.00,2,1)
(112,'建筑','觉筑生生 : 可持续建筑的人文之道','东南大学出版社',2021,'高云亭',68.00,4,1)
(113,'建筑','民用建筑空气调节','中国建筑工业',2021,'公绪金',49.00,11,7)
(114,'建筑','平城京奈良 : 古代的都市规划与营建','上海人民出版社',2021,'宫本长二郎',298.00,5,5)
(115,'建筑','智能建筑节能技术研究','北京工业大学出版社',2020,'姜杰',52.00,3,0)
(116,'建筑','点构与建筑','江苏凤凰美术出版社',2020,'姜妍',88.00,1,1)
(117,'建筑','建筑构造','中国建筑工业出版社',2021,'姜勇',69.00,10,7)
(118,'建筑','建筑工程拆除技术与组织','中国建筑工业出版社',2021,'李永福',48.00,2,0)
(119,'建筑','陕北窑洞建筑及其装饰中的匠作彩画研究','中国原子能出版社',2018,'李玉龙',58.00,2,1)
(120,'建筑','装配式建筑数字化管理与实践','中国建筑工业出版社',2021,'李政道',59.00,7,3)
此处也可以写成文件输入,加入文件读写头文件即可。但需要防止中文乱码,需要更改txt的编码模式,方式如下:
文件-另存问-编码模式选择ANSI
void insertbook() {
printf("请输入你要导入的图书所在的文件名:");
char filename[30];
scanf("%s", &filename);
FILE* fp;
fp = fopen(filename, "r");
if (fp == NULL) {
printf("打开文件错误!");
return;
}
char values[1000];
while (!feof(fp)) {
fgets(values, 1000, fp);
mysql_query(&mysql, "set names gbk");
mysql_query(&mysql, "SET CHARACTER SET GBK");
strcpy(query, "INSERT INTO book values");
strcat(query, values);
if (!mysql_query(&mysql, query)) {
printf("插入成功!\n");
}
else {
printf("插入失败,请检查。\n");
}
}
fclose(fp);
}
删除与插入基本相同,在创建query字符串时更改即可,此处不多赘述。
3.4 书余量自动更新
借助数据库中的trigger
CREATE TRIGGER add_stock AFTER UPDATE ON borrow FOR EACH ROW
BEGIN
UPDATE book
SET stock = stock + 1
WHERE
bno = old.bno and old.return_date is null and new.return_date is not null;
END
心得
差不多就是上面这样,其实写起来也挺简单的,不需要配很久环境其实,主要任务就是创建SQL语句。
(没写UI,如果需要的话可以自己加,我不是很会555)