《图书管理系统》设计指导书(最完整版) 下载本文

《图书管理系统》C# 设计指导书 V2.0 2013.8.1 — 9.20 LSH if (reader == null || readerType == null || book == null || OperatorUser == null) return false;

if (reader.rdStatus != \有效\ || (readerType.CanLendQty - reader.rdBorrowQty) <= 0)

return false;

if (book.bkStatus != \在馆\) return false;

reader.rdBorrowQty++; ReaderDAL.Update(reader);

book.bkStatus = \借出\; BookDAL.Update(book);

Borrow borrow = new Borrow(); borrow.rdID = reader.rdID; borrow.bkID = book.bkID; borrow.ldContinueTimes = 0; borrow.ldDateOut = DateTime.Now;

borrow.ldDateRetPlan = DateTime.Now.AddDays(readerType.CanLendDay); borrow.lsHasReturn = false;

borrow.OperatorLend = OperatorUser.rdName; BorrowDAL.Add(borrow); return true; }

7. 用例:续借、还书

可单独设计一个窗口,以实现按书号进行续借与还书功能。输入书号后,查询并显示(1)其借阅记录,未归还,(2)图书信息,(3)读者信息;然后进行续借或还书操作。

7. 提高篇

7.1 业务逻辑层的事务性操作与存储过程

对于事务性强的业务逻辑操作,也可以采用数据库的存储过程来实现。“借书”若采用存储过程,其实现方法如下:

(1) 在SQL Server的Library数据库中创建存储过程

41 / 47

《图书管理系统》C# 设计指导书 V2.0 2013.8.1 — 9.20 LSH

(2)编写DAL层代码,BorrowDAL类成员函数如下:

(3) 编写BLL层代码,BorrowAdmin类成员函数如下:

public int BorrowBook(int rdID, int bkID, string OperatorLend) {

return BorrowDAL.BorrowBook(rdID, bkID, OperatorLend);

42 / 47

《图书管理系统》C# 设计指导书 V2.0 }

2013.8.1 — 9.20 LSH

7.2 关于用例中操作过程的控制问题

用例的实现往往需要过程与状态控制,这是一个普遍现象,例如6.8.3节frmReader窗体的“(2)界面操作状态的控制”设计案例,该案例存在着如下问题:

(1)将操作状态的控制放入frmReader窗体类,会使UI层变得庞大而复杂; (2)增加了UI层的编程难度,程序员必须充分理解用例过程以及相关BLL层类; 我们可以有更好的设计,即在用例的UI层与BLL层之间增加一个控制类(称为“控制器”),将相关实体类以及过程与状态的控制放入其中。如在frmReader与ReaderAdmin之间增加一个ReaderController类(或取名为ReaderHandler),把Reader reader和opStatus ops以及状态变化方法迁移到其中,并根据当前状态来控制ReaderAdmin中方法的调用。将类ReaderAdmin更名为ReaderOperator更合适。

一般来说,可以将控制类放入BLL层,或成为单独的一层,即控制层(MVC软件体系结构)。

7.3 关于三层体系结构

一般在软件的三层体系结构中存在一个公用模块Common。另外,软件产品为了提供对多种不同数据库(如SQL Server、Oracle、DB2等)的支持,一般会在DAL层设计多套类库,分别实现对应数据库的数据访问。其三层体系结构图如下:

BookManage.DAL层变化如下: 类名 ReaderTypeDALSql ReaderDALSql BookDALSql BorrowDALSql SQLHelper 实现接口 原类名 IReaderTypeDAL ReaderTypeDAL IReaderDAL IBookDAL IBorrowDAL ReaderDAL BookDAL BorrowDAL SQLHelper 43 / 47

说明 修改原类名,支持MS SQL Server 《图书管理系统》C# 设计指导书 V2.0 2013.8.1 — 9.20 LSH ReaderTypeDALOracle ReaderDALOracle BookDALOracle BorrowDALOracle OracleHelper DALFactory IReaderTypeDAL IReaderDAL IBookDAL IBorrowDAL 新增类,与ReaderTypeDALSql实现的功能相同,但支持Oracle 与SQLHelper实现的功能相同,但支持Oracle 简单工厂类 OracleHelper类,可从SqlHelper方便地得到,步骤如下:

(1)BookManager.DAL项目中添加引用“System.Data.OracleClient”。

(2)复制文件SqlHelper.cs到OracleHelper.cs,然后对OracleHelper.cs内容做以下替换或修改操作

(3)using System.Data.SqlClient; 替换为:using System.Data.OracleClient; (4)将类名SqlHelper替换为OracleHelper (5)连接串修改为:

private static string _strConnection = @\Source=ORA92LSH;User ID=BookManage;Password=123;Unicode=True\;

说明:其中ORA92LSH为Oracle Net Manager配置的本地服务命名。创建Oracle数据库对象的SQL脚本,可参见文本文件“Library_ForOracle.sql”的内容。

(6)然后全文替换以下内容:

SqlConnection 替换为 OracleConnection SqlCommand 替换为 OracleCommand SqlException 替换为 OracleException SqlParameter 替换为 OracleParameter SqlDataAdapter替换为 OracleDataAdapter (7)保存后,将它添加到BookManager.DAL项目中,至此,OracleHelper类修改完毕。

Oracle存取类(ReaderTypeDALOracle, ReaderDALOracle, BookDALOracle, BorrowDALOracle)可按上面相同方法得到,只是参数有一点不同,以ReaderTypeDALSql类成员函数Get_rdType()为例,如下:

Oracle参数使用“:”,而SQL Server参数使用“@”。对应ReaderTypeDALOracle类的成员函数如下:

另外,Oracle字段类型与SQL Server有较大的不同,Oracle查询结果存放到C#的DataTable中时,数据类型差别也比较大,编程时应该注意与实体类对象的类型转换问题。实体类属性类

44 / 47