栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据库系统 图书管理系统 C语言

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据库系统 图书管理系统 C语言

数据库系统 图书管理系统 C语言 1. 实验环境配置

实验所需环境:Visual Studio 2022以及MySQL.

配置环境过程:

  1. 下载并安装MySQL。

  2. 下载并安装Navicat Premium使SQL可视化更方便。

  3. 将VS和MySQL进行连接,步骤如下:

    1. 打开项目属性

    2. C/C++—常规—附加包含目录—添加MySQL include路径

      (注意这里的路径是你安装mysql时候的路径)

    3. 连接器—常规—附加库目录—添加lib路径

    4. 链接器—输入—附加依赖项—添加libmysql.lib

    5. 后续在代码中添加#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语句字符串即可,需要注意字符串结尾不是;而是。

mysql_store_result

检索一个完整的结果集合给客户。

需要注意的是,本函数可能返回空值,因此在判断select是否有返回值时,需要判断返回的字符串是否为nullptr。

mysql_query(&mysql, "set names gbk")

防止中文查询结果乱码。

mysql_query(&mysql, "SET CHARACTER SET GBK")

保证插入成功。

在实际设计中,创建符合MYSQL语法的query语句(结尾为’’),然后使用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)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/862489.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号