SQLite+Qt 图书管理系统设计(具体实现)

本文介绍了使用SQLite轻型数据库和Qt框架设计的图书管理系统。详细讲解了数据库逻辑结构设计,包括QsqlDatabase、QsqlQuery、QsqlError、QSqlTableModel等类的使用,以及管理员登录、图书入库、查询、借书、还书等功能的实现。提供了代码示例和下载链接。
摘要由CSDN通过智能技术生成

https://github.com/birdy-C/BookSystem.git


详细设计

SQLite是一款轻型的数据库,占用资源低,与Qt的连接便易。

数据库逻辑结构设计

创建

PRAGMA foreign_keys = ON;

 

-----------------------------------------------------------------------------------------------

create table type(

Book_type nvarchar(10)        primary key         ,

Type_number     int     NOT NULL UNIQUE ,  check (Type_number  >0)        );

----------------------------------------------------------------------------------------------

create table book(

Book_ID    int     primary key         ,

Type  nvarchar(10)        REFERENCES type(Book_type)   ,

Title  nvarchar              ,

Publisher    nvarchar              ,

Publish_year       int     check(publish_year>1800 )   ,

Author       NVARCHAR               ,

Price decimal(6,2)                  ,

Number      int     check(Number>=0)      ,

Stocks        int     check(Stocks>=0)        );

--------------------------临时表,处理批量入库-------------------------------------

create table book_temp(

Type  nvarchar(10)        ,

Title  nvarchar              ,

Publisher    nvarchar              ,

Publish_year       int     ,

Author       NVARCHAR               ,

Price decimal(6,2)                  ,

Number      int     );

------------------------------------------------------------------------------------------------

create table library_card(

card_ID      int     primary key         ,

Username   varchar(10)          ,

Company   nvarchar              ,

Type  varchar(10) check (Type in ( 'student', 'teacher' ) ));

-----------------------------------------------------------------------------------------------

create table manager(

manager_ID        int     primary key         ,

Password   varchar(10) not null       ,

Name         varchar(10)          ,

Connection int               );

-----------------------------------------------------------------------------------------------

create table record (

Book_ID    int     REFERENCES book(Book_ID)    ,

card_ID      int     REFERENCES Library_card(card_ID) ,

borrow_data        data            ,

return_data data   check ( return_data >= borrow_data )      ,

manager_ID        int     REFERENCES manager(manager_ID)    ,

primary key(Book_ID,card_ID) );

 

 

 

 

触发器

 

--------------检查出版年份-----------------

 

CREATE TRIGGER Tr_check_date AFTER insert ON book

FOR EACH ROW

WHEN(

(select Book_ID from book where publish_year > (SELECT strftime('%Y',date('now')) )

)is not null)

BEGIN

SELECT RAISE(ROLLBACK, 'IMPOSSIBLE DATE') ;

END;

 

--------------检查输入时 库存与数量是否相等-----------------

 

 

CREATE TRIGGER Tr_check_number BEFORE insert ON book

FOR EACH ROW

WHEN

   ( new.Number <> new.Stocks )

BEGIN

 

SELECT RAISE(ROLLBACK, 'ANY WRONG ABOUT NUMBER?');

 

END;

 

--------------借出检查是否有余量-----------------

CREATE TRIGGER Tr_borrow_check BEFORE insert ON record

FOR EACH ROW

WHEN 0=(select Stocks from book where Book_ID=new.Book_ID)

BEGIN

  SELECT RAISE(ROLLBACK, 'NO REMAINING') ;

END;

 

 

--------------借出检查借书证 老师5学生3-----------------

CREATE TRIGGER Tr_borrow_card AFTER insert ON record

FOR EACH ROW

WHEN

(

(select count(*) from record join

         (select card_ID as S from library_card

         where card_ID = new.card_ID and Type = 'student')

         on

         record.card_ID = S

         ) >3   --学生

or

(select count(*) from record join

         (select card_ID as T from library_card

         where card_ID = new.card_ID and Type = 'teacher')

         on

         record.card_ID = T

         ) >5   --老师

 

)

BEGIN

     SELECT RAISE(ROLLBACK, 'MORE THAN PERMITTED') ;

END;

 

--------------借出更新数据-----------------

CREATE TRIGGER Tr_borrow AFTER insert ON record

FOR EACH ROW

BEGIN

  UPDATE Book

  SET Stocks = (

                   select         Stocks - 1

                   FROM Book

                   WHERE 

                   Book_ID = new.Book_ID

                   )

  WHERE

  Book_ID = new.Book_ID ;

END;

 

--------------返回更新数据-----------------

 

CREATE TRIGGER Tr_return AFTER delete ON record

FOR EACH ROW

BEGIN

  UPDATE Book

  SET Stocks = (

                   select         Stocks + 1

                   FROM Book

                   WHERE 

                   Book_ID = old.Book_ID

                   )

  WHERE

  Book_ID = old.Book_ID ;

END;

 

--------------插入检查是否已经存在-----------------

---------这一段大概有很多可以优化的地方吧……

 

CREATE TRIGGER Tr_check_insert AFTER insert ON book

FOR EACH ROW

WHEN

(

         (

         select count(Book_ID)  from book

         where Type = new.Type and Title = new.Title and Publisher = new.Publisher

                   and Publish_year = new.Publish_year and Author = new.Author and Price = new.Price

         )

         >1--except for new

)

BEGIN

UPDATE Book

    SET Stocks = (

                   select         Stocks + new.Stocks

                   FROM Book

                   where Type = new.Type and Title = new.Title and Publisher = new.Publisher

                            and Publish_year = new.Publish_year and Author = new.Author and Price = new.Price

 

                   )

         where Type = new.Type and Title = new.Title and Publisher = new.Publisher

                   and Publish_year = new.Publish_year and Author = new.Author and Price = new.Price;

UPDATE Book

    SET Number = (

                   select         Number + new.Number

                   FROM Book

                   where Type = new.Type and Title = new.Title and Publisher = new.Publisher

                            and Publish_year = new.Publish_year and Author = new.Author and Price = new.Price

                   )

    where Type = new.Type and Title = new.Title and Publisher = new.Publisher

                   and Publish_year = new.Publish_year and Author = new.Author and Price = new.Price;

          

DELETE FROM Book

    WHERE Book_ID = new.Book_ID;

END;

 

图书管理系统设计

一、主要类说明(SQL相关)以及主要使用

 

QsqlDatabase提供了一个Qt和DB的连接口。

以下代码为数据库连接代码,并且打开数据库文件DBSYSTEN.db

    /*---- LOAD IN DASTABASE ----*/

    db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("DBSYSTEM.db");

    if (!db.open()) {

        QMessageBox::warning(0, QObject::tr("Database Error"),db.lastError().text());

        qDebug() << QString("LOAD_IN");

        returnfalse;

    }

此外可以通过boolQSqlDatabase::transaction(),bool QSqlDatabase::commit(),bool QSqlDatabase::rollback()来实现相当于撤销和保存的操作。

 

QsqlQuery提供了一个SQL语句的运行接口。

如下面语句,实现的是读取Book_id对应书的库存和数量。

    QSqlQuery query_getStocks("select Stocks,Number from book where Book_id = '"+ ID +"'");

  • 16
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
图书管理系统是一个常见的应用场景,Qt+SQLite是一种较为常见的实现方式。下面我简单介绍一下Qt+SQLite实现图书管理系统的原理架构以及代码实现。 ## 原理架构 Qt是一个跨平台的GUI应用程序开发框架,可以方便地进行界面设计和事件处理。而SQLite是一种轻量级的关系型数据库,它的特点是占用资源少、易于部署和使用。将两者结合起来,就可以实现一个轻量级的图书管理系统具体实现过程如下: 1. 设计数据库结构,包括书籍信息表、借阅信息表等。 2. 使用Qt提供的SQL API连接SQLite数据库,创建数据库表和索引等。 3. 编写界面代码,设计图书添加、删除、修改、查询等功能的界面。 4. 在界面代码中调用SQL API,实现数据库的增删改查操作。 5. 编写业务逻辑代码,实现借阅、归还等功能。 ## 代码实现 下面是一个简单的图书管理系统实现代码,包括数据库的创建和表结构的定义、界面设计和业务逻辑的实现。 ### 数据库的创建和表结构的定义 ```cpp #include <QSqlDatabase> #include <QSqlQuery> #include <QDebug> // 创建数据库连接 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("library.db"); // 打开数据库 if (!db.open()) { qDebug() << "Open database failed."; return; } // 创建书籍信息表 QSqlQuery query(db); query.exec("CREATE TABLE books (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "name TEXT, " "author TEXT, " "publisher TEXT, " "isbn TEXT UNIQUE, " "count INTEGER)"); // 创建借阅信息表 query.exec("CREATE TABLE borrow (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "book_id INTEGER, " "borrower TEXT, " "borrow_date TEXT, " "return_date TEXT, " "FOREIGN KEY(book_id) REFERENCES books(id))"); ``` ### 界面设计 使用Qt提供的界面设计工具,可以轻松地设计图书管理系统的各个界面,包括添加、删除、修改、查询等功能。 ### 业务逻辑实现 ```cpp // 添加一本书籍 void addBook(const QString& name, const QString& author, const QString& publisher, const QString& isbn, int count) { QSqlQuery query(db); query.prepare("INSERT INTO books (name, author, publisher, isbn, count) " "VALUES (:name, :author, :publisher, :isbn, :count)"); query.bindValue(":name", name); query.bindValue(":author", author); query.bindValue(":publisher", publisher); query.bindValue(":isbn", isbn); query.bindValue(":count", count); query.exec(); } // 借阅一本书籍 void borrowBook(int bookId, const QString& borrower, const QString& borrowDate, const QString& returnDate) { QSqlQuery query(db); query.prepare("INSERT INTO borrow (book_id, borrower, borrow_date, return_date) " "VALUES (:bookId, :borrower, :borrowDate, :returnDate)"); query.bindValue(":bookId", bookId); query.bindValue(":borrower", borrower); query.bindValue(":borrowDate", borrowDate); query.bindValue(":returnDate", returnDate); query.exec(); // 减少书籍数量 query.prepare("UPDATE books SET count = count - 1 WHERE id = :id"); query.bindValue(":id", bookId); query.exec(); } // 查询所有书籍 QSqlQueryModel* queryAllBooks() { QSqlQueryModel* model = new QSqlQueryModel(); model->setQuery("SELECT * FROM books"); return model; } // 查询借阅信息 QSqlQueryModel* queryBorrowInfo(int bookId) { QSqlQueryModel* model = new QSqlQueryModel(); model->setQuery(QString("SELECT * FROM borrow WHERE book_id = %1").arg(bookId)); return model; } ``` 这样,一个简单的图书管理系统实现了。当然,实际应用中还需要进行一些优化和完善,例如加入用户登录、权限管理、数据备份等功能。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值