基于C语言和SQL SERVER数据库实现的图书管理系统

Sametime

发布日期: 2018-11-18 21:57:39 浏览量: 7848
评分:
star star star star star star star_border star_border star_border star_border
*转载请注明来自write-bug.com

摘 要

本文根据《数据库应用系统设计》课程要求而做。选择图书馆管理系统设计与开发是因为觉得图书馆管理系统对我们的帮助很大,并且经常去图书馆,对图书馆的大部分功能及流程还是比较了解,而且现在有些地方可能还不够完善。这次课程设计目标是建立一个比较好的图书馆管理系统,方便学生查询,方便管理员管理,节省时间,提高效率。

关键词:图书馆数据库,图书馆管理系统,嵌入式SQL

第1章 概述

1.1 项目背景

随着科技的发展,尤其是计算机技术的迅猛发展,图书馆管理的问题从以往的人工管理,到现在的电脑化,系统化,是对图书馆管理方法的质的飞跃,这些技术不仅让图书馆管理变得更加方便、快捷、提高效率,对于用户来说也是有极大地帮助,系统化的图书馆让人们可以更方便的去找书,借书,还书等等一系列的功能,从而让图书馆实现了它的最大化价值。同时对于图书馆本身来说,通过系统,它可以提高图书管理的效率,也是图书馆的科学化、正规化管理的最好方法。所以,图书馆管理系统的研究开发,是一个特别值得去做的研究。

1.2 编写目的

根据所学的数据库系统与程序设计的知识,针对图书管理系统,进行系统的需求分析,系统设计,数据库设计,编码,测试等,完成题目要求的功能,从而达到掌握开发一个小型数据库的目的。

1.3 软件定义

本系统采用VC++6.0集成开发系统作为前台开发Windows窗体控制平台,采用SQL Server 2008作为后台数据库的管理程序。

1.4 开发环境

本系统适合运用于图书馆针对管理借阅者借阅图书。

下面简单介绍一下本系统的运行环境:

  • 操作系统:Windows 7

  • 数据库服务器:Microsoft SQL Server2008

  • 编程工具:VC++6.0

  • 绘图工具:Microsoft Visio 2010

第2章 需求分析

2.1 问题陈述

2.1.1 基本功能

图书管理系统,实现读者信息的借阅证号、姓名、年龄、职业等信息的管理;实现对图书信息的图书号、作者名、出版社、单价等信息点的管理,实现借阅信息的借阅证号、书号、时间等信息的管理,实现对逾期读者的管理。

2.1.2 数据库需要实现的功能

创建存储过程查询图书的数量;创建视图查询借阅逾期信息;创建触发器当增加、删除、修改读者信息或者图书信息时自动修改相应表的数据更新;建立数据库相关表之间的参照完整性约束。

2.1.3 系统需要实现的功能

能实现以下主要功能:

  • 图书基本情况的录入、修改、删除等基本操作

  • 实现借书功能

  • 实现还书功能

  • 实现对所有购进图书的分类查询和分类统计

  • 能够按书名、作者等分类查询现有图书的数量

  • 对超期的情况能自动给出提示信息

2.2 业务处理流程

2.3 数据流图

图书管理系统数据流图

读者借书还书数据流图

读者查询图书数据流图

采购员采购图书数据流图

管理员维护图书馆数据流图

2.4 数据字典

2.4.1 图书管理员

  1. Admin_id CHAR(7)
  2. Admin_password CHAR(8)
  3. Admin_name NCHAR(5)

2.4.2 读者

  1. Reader_id CHAR(7)
  2. Reader_password CHAR(8)
  3. Reader_name NCHAR(5)
  4. Reader_sex NCHAR(1)
  5. Reader_age TINYINT
  6. Reader_Company NVARCHAR(20)
  7. Reader_work NVARCHAR(20)

2.4.3 图书信息表

  1. Book_id CHAR(6)
  2. Book_name NVARCHAR(20)
  3. Book_writer NCHAR(5)
  4. Book_publisher NVARCHAR(20)
  5. Book_price SMALLINT
  6. Book_introduction NVARCHAR(100)
  7. Book_type NVARCHAR(20)

2.4.4 借阅信息表

  1. Reader_id CHAR(7)
  2. Book_id CHAR(6)
  3. Borrow_time DATE

2.4.5 图书馆采购员

  1. Shopper_id CHAR(7)
  2. Shopper_name NCHAR(5)
  3. Shopper_sex NCHAR(1)
  4. Shopper_age TINYINT

2.4.6 图书采购信息表

  1. Shopper_id CHAR(7)
  2. Book_id CHAR(6)
  3. Shop_time DATE,

2.4.7 图书历史借阅表

  1. Reader_id CHAR(7)
  2. Book_id CHAR(6)
  3. Borrow_time DATE
  4. Return_time DATE

第3章 概念结构设计

3.1 ER模型图

3.1.1 实体ER图

图书ER图

图书管理员ER图

图书采购员ER图

读者ER图

3.1.2 实体联系ER图

3.1.3 完整ER模型图

第4章 逻辑结构设计

4.1 关系模式

针对图书管理信息系统的需求,通过对借书流程的分析以及对ER图的分析,设计如下面的关系模式:

  • 读者信息表,包括的数据项有:(借阅证号、密码、姓名、性别、年龄、所在单位、职业)

  • 图书信息表,包括的数据项有:(书号、书名、作者、出版社、价格、内容简介、图书类型、库存)

  • 借书信息表,包括的数据项有:(书号、借书时间、借阅证号)

  • 还书信息表,包括的数据项有:(书号、还书时间、借阅证号)

  • 管理员信息表,包括的数据项有:(管理员号、密码、姓名)

  • 采购员信息表,包括的数据项有:(采购员号、姓名、性别、年龄)

  • 采购信息表,包括的数据项有:(采购员号、书号、采购时间)

4.2 规范化基本表

经过对初始关系模式的规范化处理,以下关系模式中不存在部分函数依赖和传递函数依赖,已经达到3NF。

  • 读者信息表,包括的数据项有:(借阅证号、密码、姓名、性别、年龄、所在单位、职业)

  • 图书信息表,包括的数据项有:(书号、书名、作者、出版社、价格、内容简介、图书类型)

  • 借阅信息表,包括的数据项有:(书号借阅证号、借书时间)

  • 管理员信息表,包括的数据项有:(管理员号、密码、姓名)

  • 采购员信息表,包括的数据项有:(采购员号、姓名、性别、年龄)

  • 采购信息表,包括的数据项有:(采购员号书号、采购时间)

  • 借阅历史表,包括的数据项有:(书号借阅证号借书时间、还书时间)

模型中画双划线的是主码,并且借阅证号和书号是借阅关系的外码,采购员号和书号是采购关系的外码。书号、借阅证号、借书时间是借阅历史表的外码。

5.3 数据库关系图

第6章 物理结构设计

6.1 系统功能结构图

6.2 功能描述

  • 用户登录

    • 选择登录系统的用户类型,进行不同的功能使用
  • 查看图书信息

    • 查看数据库中各种图书的信息,进行其他操作
  • 修改个人信息

    • 对数据库中的个人信息进行更新
  • 还书

    • 借阅信息的更新
  • 借书

    • 插入借阅信息
  • 查看借阅记录

    • 输出个人的借阅情况
  • 读者管理

    • 对读者进行增、删、改操作
  • 图书管理

    • 对图书进行增、删、改操作
  • 查看当前逾期信息

    • 查看数据库中当前用户逾期罚款信息

第7章 代码设计和界面设计

7.1代码设计

7.1.1 数据库的连接

本系统是通过VC嵌入式SQL来进行数据库的连接的,主要代码如下:

  1. int CONNECT()
  2. {
  3. EXEC SQL CONNECT TO MS-20170511WSQV.Library_342 USER abc.abcd;
  4. if(sqlca->sqlcode==0)
  5. {
  6. printf("Connection to SQL Server established\n");
  7. }
  8. else
  9. {
  10. printf("ERROR: Connection to SQL Server failed\n");
  11. return 1;
  12. }
  13. }
  14. int DISCONNECT()
  15. {
  16. EXEC SQL DISCONNECT ALL;
  17. if(sqlca->sqlcode==0)
  18. {
  19. printf("DISConnection to SQL Server established\n");
  20. }
  21. else
  22. {
  23. printf("ERROR: DISConnection to SQL Server failed\n");
  24. return 1;
  25. }
  26. return 1;
  27. }

7.1.2 主函数main

系统程序的主函数设计,通过调用其他函数来实现管理图书系统;

  1. int main()
  2. {
  3. int select_num;
  4. int login_num;
  5. CONNECT();
  6. start_meun();
  7. while(1)
  8. {
  9. scanf("%d",&select_num);
  10. switch(select_num)
  11. {
  12. case 1:break;
  13. case 0://退出系统
  14. {
  15. system("cls");
  16. DISCONNECT();
  17. printf(" --------------------------------------------------\n");
  18. printf(" -= 感谢使用,再见! =- \n");
  19. printf(" --------------------------------------------------\n");
  20. system("pause");
  21. exit(0);
  22. }
  23. default:printf("输入错误,请重新输入:");continue;
  24. }
  25. break;
  26. }
  27. while(1){
  28. login_meun();//登录界面函数
  29. login_num=login ();//登录处理
  30. switch(login_num)
  31. {
  32. case 1:admin();break;
  33. case 2:reader();break;
  34. }
  35. }
  36. }

7.1.3 头文件

包含头文件、全局变量定义以及函数声明:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. char LReader_num[20];
  5. /**********函数声明**********/
  6. int CONNECT();
  7. int DISCONNECT();
  8. void start_meun(); //初始界面
  9. void login_meun(); //登录界面函数
  10. int login (void); //用户登录函数
  11. void admin_menu(); //管理员功能界面函数
  12. void reader_meun(); //读者功能界面函数
  13. void admin(); //管理员函数
  14. void reader(); //读者函数
  15. void admin_reader(); //管理读者函数
  16. void admin_book(); //管理图书函数
  17. void allborrow(); //查看借阅情况函数
  18. void overdue(); //超期罚款函数
  19. void adminreader_menu();
  20. void adminbook_menu();
  21. void addreader(); //增加读者函数
  22. void deletereader(); //删除读者函数
  23. void updatereader(); //修改读者函数
  24. void addbook(); //增加图书函数
  25. void deletebook(); //删除图书函数
  26. void updatebook(); //修改图书函数
  27. void borrowbook(); //借书函数
  28. void returnbook(); //还书函数
  29. void searchpersonborrow();//查看个人借阅函数
  30. void updateme(); //修改个人信息函数
  31. void allbook(); //查看所有图书函数
  32. void allreader(); //查看所有读者函数

7.1.4 用户登录函数

本系统用户分为两类,一类是读者,一类是管理员,分别拥有不一样的功能权限;区分两者的方法是链接数据库查询登录用户是否在数据库中的读者表中或者管理员表中;代码如下:

  1. for(;;)
  2. {
  3. printf("管理员账号:");
  4. scanf("%s",&admin_num);
  5. printf("登陆密码:");
  6. scanf("%s",&admin_pass);
  7. EXEC SQL SELECT Admin_id, Admin_password INTO :admin_num,:admin_pass
  8. FROM Admin
  9. WHERE Admin_id=:admin_num AND Admin_password=:admin_pass;
  10. if(sqlca->sqlcode!=0)
  11. {
  12. printf("发生了错误%d\n",SQLCODE);
  13. count+=1;
  14. printf("帐号密码错误,请重新输入\n");
  15. if(count>=3)
  16. {
  17. system("cls");
  18. DISCONNECT();
  19. printf(" ---------------------------------------------------\n");
  20. printf(" -= 感谢使用,再见! =- \n");
  21. printf(" ---------------------------------------------------\n");
  22. system("pause");
  23. exit(0);
  24. }
  25. continue;
  26. }
  27. printf("登录成功!\n");
  28. break;
  29. }

7.1.5 读着管理

管理员对于读者的管理操作,包括增删改,增加读者代码如下:

  1. void addreader()
  2. {
  3. char YN;
  4. printf("输入读者的ID:");
  5. scanf("%s",&LReader_id);
  6. printf("输入读者的密码:");
  7. scanf("%s",&LReader_password);
  8. printf("输入读者的名字:");
  9. scanf("%s",&LReader_name);
  10. printf("输入读者的性别:");
  11. scanf("%s",&LReader_sex);
  12. printf("输入读者的年龄:");
  13. scanf("%d",&LReader_age);
  14. printf("输入读者的所在单位:");
  15. scanf("%s",&LReader_Company);
  16. printf("输入读者的职业:");
  17. scanf("%s",&LReader_work);
  18. EXEC SQL INSERT INTO Reader
  19. VALUES(:LReader_id,:LReader_password,:LReader_name,:LReader_sex,:LReader_age,:LReader_Company,:LReader_work);
  20. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  21. {
  22. printf("发生了错误%d\n",SQLCODE);
  23. return 1;
  24. }
  25. else
  26. {
  27. printf("增加成功!");
  28. }
  29. printf("是否需要打印(Y/N):");
  30. do{scanf("%s",&YN);}
  31. while(YN != 'N' && YN != 'n' && YN != 'Y' && YN != 'y');
  32. if (YN == 'y' || YN == 'Y')
  33. {
  34. printf("\n%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "Reader_id", "Reader_password", "LReader_name", "Reader_sex", "Reader_age", "Reader_Company", "Reader_work");
  35. printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10d\t%-10s\t%-10s\n", LReader_id, LReader_password, LReader_name, LReader_sex, LReader_age, LReader_Company, LReader_work);
  36. printf("打印完成!返回主菜单!\n");
  37. return 1;
  38. }
  39. printf("操作完成!返回主菜单!\n");
  40. }

7.1.6 输出所有读者

运用游标,链接数据库将表中所有信息打印出来;代码如下:

  1. void allborrow()
  2. {
  3. int count=0;
  4. EXEC SQL DECLARE AX CURSOR FOR
  5. SELECT Reader_id,Book_id,Borrow_time
  6. FROM Borrow;
  7. EXEC SQL OPEN AX;
  8. for ( ; ; )
  9. {
  10. EXEC SQL FETCH AX INTO :LReader_id,:LBook_id,:LBorrow_time;
  11. if (sqlca->sqlcode!=0)
  12. {
  13. break;
  14. }
  15. if(count++ == 0)
  16. {
  17. printf("借阅情况<未还>:");
  18. printf("\n%-10s %-10s %-15s\n", "Reader_id", "Book_id", "Borrow_time");
  19. }
  20. printf("%-10s %-10s %-15s\n", LReader_id, LBook_id, LBorrow_time);
  21. }
  22. EXEC SQL CLOSE AX;
  23. count=0;
  24. EXEC SQL DECLARE BX CURSOR FOR
  25. SELECT Reader_id,Book_id,Borrow_time,Return_time
  26. FROM History;
  27. EXEC SQL OPEN BX;
  28. for ( ; ; )
  29. {
  30. EXEC SQL FETCH BX INTO :LReader_id,:LBook_id,:LBorrow_time,:LReturn_time :LNull;
  31. if (sqlca->sqlcode!=0)
  32. {
  33. printf("打印完成!返回主菜单!\n");
  34. break;
  35. }
  36. if(count++ == 0)
  37. {
  38. printf("借阅历史<已还>:");
  39. printf("\n%-10s %-10s %-15s %-15s\n", "Reader_id", "Book_id", "Borrow_time", "Return_time");
  40. }
  41. printf("%-10s %-10s %-15s %-15s\n", LReader_id, LBook_id, LBorrow_time, LReturn_time);
  42. }
  43. EXEC SQL CLOSE BX;
  44. }

7.1.7 图书管理

管理员对于图书的管理操作,包括增删改,删除图书代码如下:

  1. void deletebook()
  2. {
  3. char YN;
  4. printf("请输入你要删除的图书的ID:");
  5. scanf("%s",&LBook_id);
  6. EXEC SQL SELECT Book_id, Book_name, Book_writer, Book_publisher, Book_price, Book_introduction, Book_type, Book_num, Book_allnum INTO :LBook_id, :LBook_name, :LBook_writer:LNull,:LBook_publisher:LNull,:LBook_price:LNull,:LBook_introduction:LNull,:LBook_type,:LBook_num,:LBook_allnum
  7. FROM Book
  8. WHERE Book_id=:LBook_id;
  9. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  10. {
  11. printf("发生了错误%d\n",SQLCODE);
  12. return 1;
  13. }
  14. printf("\n%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "Book_id", "Book_name", "Book_writer", "Book_publisher", "Book_price", "Book_intro..", "Book_type", "Book_num", "Book_allnum");
  15. printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10d\t%-10s\t%-10s\t%-10d\t%-10d\n", LBook_id, LBook_name, LBook_writer, LBook_publisher, LBook_price, LBook_introduction, LBook_type, LBook_num, LBook_allnum);
  16. printf("是否删除该图书(Y/N):");
  17. do{scanf("%s",&YN);}
  18. while(YN != 'N' && YN != 'n' && YN != 'Y' && YN != 'y');
  19. if (YN == 'y' || YN == 'Y')
  20. {
  21. EXEC SQL DELETE
  22. FROM Book
  23. WHERE Book_id=:LBook_id;
  24. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  25. {
  26. printf("发生了错误%d\n",SQLCODE);
  27. return 1;
  28. }
  29. else
  30. {
  31. printf("删除成功!返回主菜单!\n");
  32. }
  33. }
  34. }

7.1.8 借阅信息函数

查看当前借阅的信息,连接数据库,输出已还借阅信息和未还的借阅信息,代码如下:

  1. void allborrow()
  2. {
  3. int count=0;
  4. EXEC SQL DECLARE AX CURSOR FOR
  5. SELECT Reader_id,Book_id,Borrow_time
  6. FROM Borrow;
  7. EXEC SQL OPEN AX;
  8. for ( ; ; )
  9. {
  10. EXEC SQL FETCH AX INTO :LReader_id,:LBook_id,:LBorrow_time;
  11. if (sqlca->sqlcode!=0)
  12. {
  13. break;
  14. }
  15. if(count++ == 0)
  16. {
  17. printf("借阅情况<未还>:");
  18. printf("\n%-10s %-10s %-15s\n","Reader_id","Book_id","Borrow_time");
  19. }
  20. printf("%-10s %-10s %-15s\n",LReader_id,LBook_id,LBorrow_time);
  21. }
  22. EXEC SQL CLOSE AX;
  23. count=0;
  24. EXEC SQL DECLARE BX CURSOR FOR
  25. SELECT Reader_id,Book_id,Borrow_time,Return_time
  26. FROM History;
  27. EXEC SQL OPEN BX;
  28. for ( ; ; )
  29. {
  30. EXEC SQL FETCH BX INTO :LReader_id,:LBook_id,:LBorrow_time,:LReturn_time :LNull;
  31. if (sqlca->sqlcode!=0)
  32. {
  33. printf("打印完成!返回主菜单!\n");
  34. break;
  35. }
  36. if(count++ == 0)
  37. {
  38. printf("借阅历史<已还>:");
  39. printf("\n%-10s %-10s %-15s %-15s\n", "Reader_id", "Book_id", "Borrow_time", "Return_time");
  40. }
  41. printf("%-10s %-10s %-15s %-15s\n", LReader_id, LBook_id, LBorrow_time, LReturn_time);
  42. }
  43. EXEC SQL CLOSE BX;
  44. }

7.1.9 逾期信息函数

连接数据库查看视图,输出超期罚款信息,代码如下:

  1. void overdue()
  2. {
  3. int count=0;
  4. EXEC SQL DECLARE QX CURSOR FOR
  5. SELECT *
  6. FROM view_overdue;
  7. EXEC SQL OPEN QX;
  8. for ( ; ; )
  9. {
  10. EXEC SQL FETCH QX INTO
  11. :LReader_id,:LReader_name,:LBook_name,:LBorrow_time,:LOver_time,:LFine;
  12. if (sqlca->sqlcode!=0)
  13. {
  14. printf("发生了错误%d\n",SQLCODE);
  15. printf("打印完成!返回主菜单!\n");
  16. break;
  17. }
  18. if(count++ == 0)
  19. {
  20. printf("\n%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "Reader_id", "LReader_name", "Book_id", "Borrow_time", "超期[天]", "罚款[元]");
  21. }
  22. printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10d\t%-10f\n", LReader_id, LReader_name, LBook_name, LBorrow_time, LOver_time, LFine);
  23. }
  24. EXEC SQL CLOSE QX;
  25. }

7.1.10 借书函数

读者对于图书的借阅操作,代码如下:

  1. void borrowbook()
  2. {
  3. char YN;
  4. allbook();
  5. printf("请输入你要借阅的图书的ID:");
  6. scanf("%s",&LBook_id);
  7. EXEC SQL SELECT Book_id,Book_name,Book_writer,Book_publisher,Book_price,
  8. Book_introduction,Book_type,Book_num,Book_allnum
  9. INTO :LBook_id,:LBook_name,:LBook_writer:LLNull,:LBook_publisher:LLNull,
  10. :LBook_price:LLNull,:LBook_introduction:LLNull,:LBook_type,:LBook_num,:LBook_allnum
  11. FROM Book
  12. WHERE Book_id=:LBook_id;
  13. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  14. {
  15. printf("发生了错误%d\n",SQLCODE);
  16. return 1;
  17. }
  18. printf("\n%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n","Book_id", "Book_name", "Book_writer", "Book_publisher", "Book_price", "Book_intro...", "Book_type", "Book_num", "Book_allnum");
  19. printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10d\t%-10s\t%-10s\t%-10d\t%-10d\n", LBook_id, LBook_name, LBook_writer, LBook_publisher, LBook_price, LBook_introduction, LBook_type, LBook_num, LBook_allnum);
  20. printf("是否借阅该图书(Y/N):");
  21. do{scanf("%s",&YN);}
  22. while(YN != 'N' && YN != 'n' && YN != 'Y' && YN != 'y');
  23. if (YN == 'y' || YN == 'Y')
  24. {
  25. printf("输入借阅时间(2017-XX-XX):");
  26. scanf("%s",&LBorrow_time);
  27. EXEC SQL INSERT
  28. INTO Borrow(Reader_id,Book_id,Borrow_time)
  29. VALUES(:LReader_num,:LBook_id,:LBorrow_time);
  30. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  31. {
  32. printf("发生了错误%d\n",SQLCODE);
  33. return 1;
  34. }
  35. printf("借阅成功!打印借阅信息!\n");
  36. EXEC SQL SELECT Reader_id,Book_id,Borrow_time INTO :LReader_id,:LBook_id,:LBorrow_time
  37. FROM Borrow
  38. WHERE Reader_id=:LReader_num AND Book_id=:LBook_id;
  39. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  40. {
  41. printf("发生了错误%d\n",SQLCODE);
  42. return 1;
  43. }
  44. printf("\n%-10s %-10s %-15s\n","Reader_id","Book_id","Borrow_time");
  45. printf("%-10s %-10s %-15s\n",LReader_id,LBook_id,LBorrow_time);
  46. printf("操作完成!返回主菜单!\n");
  47. }
  48. }

7.1.11 还书函数

读者对于图书的借阅操作,代码如下:

  1. void returnbook()
  2. {
  3. char YN;
  4. printf("请输入你要归还的图书的ID:");
  5. scanf("%s",&LBook_id);
  6. EXEC SQL SELECT Reader_id,Book_id,Borrow_time INTO :LReader_id,:LBook_id,:LBorrow_time
  7. FROM Borrow
  8. WHERE Reader_id=:LReader_num AND Book_id=:LBook_id;
  9. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  10. {
  11. printf("发生了错误%d\n",SQLCODE);
  12. return 1;
  13. }
  14. printf("\n%-10s %-10s %-15s\n","Reader_id","Book_id","Borrow_time");
  15. printf("%-10s %-10s %-15s\n",LReader_id,LBook_id,LBorrow_time);
  16. printf("是否归还该图书(Y/N):");
  17. do{scanf("%s",&YN);}
  18. while(YN != 'N' && YN != 'n' && YN != 'Y' && YN != 'y');
  19. if (YN == 'y' || YN == 'Y')
  20. {
  21. printf("输入归还时间(2017-XX-XX):");
  22. scanf("%s",&LReturn_time);
  23. EXEC SQL DELETE
  24. FROM Borrow
  25. WHERE Reader_id=:LReader_num AND Book_id=:LBook_id;
  26. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  27. {
  28. printf("发生了错误%d\n",SQLCODE);
  29. return 1;
  30. }
  31. EXEC SQL UPDATE History
  32. SET Return_time=:LReturn_time
  33. WHERE Reader_id=:LReader_num
  34. AND Book_id=:LBook_id AND Borrow_time=:LBorrow_time;
  35. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  36. {
  37. printf("发生了错误%d\n",SQLCODE);
  38. return 1;
  39. }
  40. printf("归还成功!打印信息!\n");
  41. EXEC SQL SELECT Reader_id,Book_id,Borrow_time
  42. ,Return_time INTO :LReader_id,:LBook_id,:LBorrow_time,:LReturn_time:LLNull
  43. FROM History
  44. WHERE Reader_id=:LReader_num
  45. AND Book_id=:LBook_id AND Borrow_time=:LBorrow_time;
  46. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  47. {
  48. printf("发生了错误%d\n",SQLCODE);
  49. return 1;
  50. }
  51. printf("\n%-10s %-10s %-15s %-15s\n", "Reader_id", "Book_id", "Borrow_time", "Return_time");
  52. printf("%-10s %-10s %-15s %-15s\n", LReader_id, LBook_id, LBorrow_time, LReturn_time);
  53. printf("操作完成!返回主菜单!\n");
  54. }
  55. }

7.1.12 个人信息修改函数

读者对于自己的个人信息修改操作;代码如下:

  1. void updateme()
  2. {
  3. char YN;
  4. printf("你的个人信息:\n");
  5. EXEC SQL SELECT Reader_id,Reader_password,
  6. Reader_name,Reader_sex,Reader_age,Reader_Company,Reader_work INTO
  7. :LReader_id,:LReader_password,:LReader_name,:LReader_sex:LNull,
  8. :LReader_age:LNull,:LReader_Company:LNull,:LReader_work:LNull
  9. FROM Reader
  10. WHERE Reader_id=:LReader_num;
  11. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  12. {
  13. printf("发生了错误%d\n",SQLCODE);
  14. return 1;
  15. }
  16. printf("\n%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "Reader_id", "Reader_password", "LReader_name", "Reader_sex", "Reader_age", "Reader_Company", "Reader_work");
  17. printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10d\t%-10s\t%-10s\n", LReader_id, LReader_password, LReader_name, LReader_sex, LReader_age, LReader_Company, LReader_work);
  18. printf("是否修改(Y/N):");
  19. do{scanf("%s",&YN);}
  20. while(YN != 'N' && YN != 'n' && YN != 'Y' && YN != 'y');
  21. if (YN == 'y' || YN == 'Y')
  22. {
  23. printf("输入新的密码:");
  24. scanf("%s",&LReader_password);
  25. printf("输入新的名字:");
  26. scanf("%s",&LReader_name);
  27. printf("输入新的性别:");
  28. scanf("%s",&LReader_sex);
  29. printf("输入新的年龄:");
  30. scanf("%d",&LReader_age);
  31. printf("输入新的所在单位:");
  32. scanf("%s",&LReader_Company);
  33. printf("输入新的职业:");
  34. scanf("%s",&LReader_work);
  35. EXEC SQL UPDATE Reader
  36. SET Reader_password=:LReader_password,Reader_name=:LReader_name,
  37. Reader_sex=:LReader_sex,Reader_age=:LReader_age,
  38. Reader_Company=:LReader_Company,Reader_work=:LReader_work
  39. WHERE Reader_id=:LReader_num;
  40. if(sqlca->sqlcode!=0) /*sqlcode!=0,表示操作不成功*/
  41. {
  42. printf("发生了错误%d\n",SQLCODE);
  43. return 1;
  44. }
  45. else
  46. {
  47. printf("修改成功!查看修改结果!\n");
  48. EXEC SQL SELECT Reader_id,Reader_password,Reader_name,
  49. Reader_sex,Reader_age,Reader_Company,Reader_work INTO
  50. :LReader_id,:LReader_password,:LReader_name,:LReader_sex:LNull,
  51. :LReader_age:LNull,:LReader_Company:LNull,:LReader_work:LNull
  52. FROM Reader
  53. WHERE Reader_id=:LReader_id; printf("\n%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "Reader_id", "Reader_password", "LReader_name", "Reader_sex", "Reader_age", "Reader_Company", "Reader_work"); printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10d\t%-10s\t%-10s\n", LReader_id, LReader_password, LReader_name, LReader_sex, LReader_age, LReader_Company, LReader_work);
  54. }
  55. printf("操作完成!返回主菜单!\n");
  56. return 1;
  57. }
  58. printf("操作完成!返回主菜单!\n");
  59. }

7.2界面设计

7.2.1 初始界面

7.2.2 登录界面

7.2.3 管理员功能界面

7.2.4 读者功能界面

7.2.5 图书管理界面

7.2.6 读者管理界面

第8章 总结

对于此次数据库系统设计实验,主要有两方面的总结;

一方面是对于实验中各种错误的总结;实验中遇到过很多错误,一些粗心的小错误到对于不熟悉的知识点运用的错误,多次导致实验的进展缓慢,在查阅错误的原因以及反复修改中,错误的积累,对之后的更加流畅也有了一定的帮助,前期的错误较多,后期之间越来越少,从错误中吸取了不少经验,很有帮助;

另一方面是实验的设计考虑不周全导致的错误的总结;对数据库的设计由开始的初步设计,缺少了一些深入的思考,导致对数据库的表的划分创建不太完善,表项也有不合理之处,到了后面的设计才发现设计的数据库的结构有漏洞,不得已又修改完善数据库的结构,导致大面积修改的情况,增加了工作量;

所以,在以上错误的认知上总结,今后做事做设计都要考虑清楚,不贪图一时的轻松,而是应该做到完善,尽可能的考虑到所有的可能出现的漏洞,避免重复不必要的工作,也很感谢在实现遇到困难时帮助我的同学,也很感谢老师这学期的教学,让我更加深入的学习了数据库的知识,通过这次的数据库设计,加深了对数据库系统的基本概念、原理和技术的理解和掌握,将理论与实际相结合,应用现有的数据建模工具和数据库管理系统软件,规范、科学地完成一个小型数据库应用系统的设计与实现,并在此基础上提高实际动手能力和创新能力。

参考文献

[1] 王珊、萨师煊,数据库系统概论(第五版),北京:高等教育出版社,2014.9

[2] 刘振安,C程序设计课程设计(第二版),北京:机械工业出版社,2009.11

[3] 郭有强,C语言程序设计实验指导与课程设计,北京:清华大学出版社,2009.2

上传的附件 cloud_download 基于C语言和SQL SERVER数据库实现的图书管理系统.7z ( 1.18mb, 803次下载 )
error_outline 下载需要10点积分

发送私信

懒惰有懒惰的好处,勤奋有勤奋的乐趣。重要的是,你有享受过程的权利,就有承担后果的义务

6
文章数
7
评论数
最近文章
eject