1、目录摘 要2正文31 实验目的32 实验要求33数据字典34概念结构设计74.1设计方法和步骤74.2概念结构E-R图75逻辑结构设计85.1关系模式设计与优化85.2系统结构图95.3系统完整性设计106数据库物理设计106.1索引的选择建立106.2确定系统配置106.3模块设计117数据库实施127.1数据库创建127.2数据库备份和恢复方案147.3用户界面设计和应用程序编码148.系统测试方案和测试报告268.1测试方案268.2测试过程26总结与致谢36参考文献37摘 要信息在社会和经济的发展中所起的作用越来越为人们所重视。资源的开发利用水平成为衡量一个国家综合国力的重要标志之一。
2、计算机作为信息处理的工具,为适应数据处理需求的迅速提高,满足各类信息系统对数据管理的要求,在文件系统的基础上发展基础数据库系统,数据库方法针对事物处理中大量数据管理需求。随着微机管理系统的推广,数据库应用逐渐普及。因此大力开发管理系统。Microsoft SQL Server 2000数据库管理系统是微软公司研制开发的关系型数据库管理系统。该系统支持并扩展了SQL语言标准,可以运用标准SQL语句对数据进行操作,也可以使用功能强大的GUI工具进行灵活的数据管理。同时,系统还提供功能完善的API,可以在应用程序中调用这些API来实现与数据库系统的连接以及相关数据的操作。sp3是该系统的一个版本号,
3、只有sp3以上的SQL 2000系统才能够支持纯JDBC连接方式。关键字:Microsoft SQL Server ; JDBC连接方式正文1 实验目的1、加深对数据库系统、软件工程、程序设计语言的理论知识的理解和应用水平;2、在理论和实验教学基础上进一步巩固已学基本理论及应用知识并加以综合提高;3、学会将知识应用于实际的方法,提高分析和解决问题的能力,增强动手能力;4、为毕业设计和以后工作打下必要基础。2 实验要求设计一个订户订阅报刊的应用系统。涉及订单、订户、报刊目录及投递卡信息。系统功能包括:1. 订户管理:订户增加、修改、删除。2. 报刊管理:报刊增加、删除、修改。3. 订单管理:完成
4、订户订阅数据的管理和查询订单详细情况。4统计查询:按报刊目录统计各类报刊的订阅数量及金额。3数据字典3.1 数据结构管理员用户=管理员帐户+管理员密码订户=订户编号+订户名+联系电话+联系地址目录=目录编号+目录名+单价+批注信息订单=订单号+订户编号+下订日期订单细节=订单号+目录编号+订阅数量+订阅期数+单价+总价(注:为保证订单确定后价格不随目录单价变动,订单细节中应该有独立的单价来记录下订时目录的单价)3.2数据项编号标识符类型长度所属表名同义名1UNameVarchar20Login管理员帐户2UPasswordVarchar20Login管理员密码3CidVarchar10Cust
5、omer,Order订户编号4CnameVarchar20Customer订户名5PhoneVarchar15Customer联系电话6AddressVarchar50Customer联系地址7DidVarchar10Diretory,OrderDetail目录编号8DnameVarchar20Diretory目录名9UnitPriceFloat8DiretoryOrderDetail目录单价,下订时目录单价10IfoVarchar50Diretory批注信息11OnoVarchar10Order,OrderDetail订单编号12OdateDatetime8Order下订日期13Quanti
6、ty, Int4OrderDetail订阅数量14QiShu,Int4OrderDetail订阅期数15TotalFloat8OrderDetail订单项总价 表1:数据项表3.3数据流编号名称来源去向组成1身份信息系统管理员应用系统管理员帐户+密码2授权信息应用系统系统管理员3错误身份信息应用系统系统管理员4查询请求系统管理员应用系统待查询对象识别符(如Cid,Ono)5查询结果应用系统系统管理员被查询对象具体信息6管理请求系统管理员应用系统识别符(Cid,Ono等)+管理类型7管理结果信息应用系统系统管理员被管理对象处理结果8非法请求应用系统系统管理员非法请求提示信息 表2:数据流表图1:
7、报刊订阅系统顶层图图2:系统0层图图3:加工2细化图图4: 加工3细化图4概念结构设计4.1设计方法和步骤采用自底而上的设计方法。先自顶向下地进行需求分析,对报刊订阅管理系统的需求进行逐步细化;然后再自底而上地设计概念结构,最终将各个局部应用的概念结构集合成为全局概念结构。4.2概念结构E-R图通过对局部应用的选择,逐一设计出分E-R图,并对各个分E-R图进行合并,生成初步E-R图,消除不必要的系统冗余,可以得出以下报刊订阅管理系统E-R图。图5: 报刊订阅管理系统E-R图5逻辑结构设计5.1关系模式设计与优化根据概念结构的设计,可以将系统E-R图转换为以下关系模式:Customer(Cid,
8、 Cname, Phone, Address)Diretory(Did, Dname, UnitPrice,Ifo)Order(Ono, Cid, Odate) Foreign key:CidOrderDetail(Ono, Did, Quantity, QiShu, UnitPrice, Total)Foreign key:Ono,DidLogin (UName,UPassword)对上面关系模式进行分析可知:表Customer、Diretory、Order、Login都属于BCNF范式,在数据操作性能和存储空间的利用率上都比较高。OrderDetail虽然属于第二范式:(Ono,Did)Q
9、uantity,(Ono,Did)QiShu,(Ono,Did)UnitPrice,(Quantity,QiShu,UnitPrice)Total,(Ono,Did)Total.但是,将Total作为一个属性独立出来有利于统计和查询,减少反复运算操作,这种空间上的牺牲是比较有价值的。5.2系统结构图图6: 系统结构图5.3系统完整性设计Customer (Cid, Cname, Phone, Address)其中:Cid为主码,Address约束为非空Diretory (Did, Dname, UnitPrice,Ifo)其中:Did为主码,UnitPrice约束为非空Order (Ono,
10、Cid, Odate)其中:Ono为主码,Cid为外码(参照对象为Customer(Cid))OrderDetail (Ono, Did, Quantity, QiShu, UnitPrice, Total)其中:(Ono,Did)为主码,Ono和Did分别为外码(参照分别为:Order(Ono)和Diretory(Did)).Quantity,QiShu,UnitPrice分别约束为非空Login (UName,UPassword)其中(UName,UPassword)为主码。6数据库物理设计6.1索引的选择建立由于系统可能要涉及大量数据的操作,所以索引的建立就成为一种必需。本系统采用B+树
11、索引方法,分别在各Customer,Diretory,Order和OrderDetail各个表的主键上建立索引。6.2数据存放位置本系统数据和索引存放在磁盘中。6.3确定系统配置根据具体需要配置。6.4模块设计6.4.1登陆模块图7:登陆模块IPO图6.4.2管理功能模块图8:管理功能模块IPO图6.4.3查询功能模块图9 : 查询功能模块IPO图6.4.4报表导出模块图10: 报表导出模块IPO图7数据库实施7.1数据库创建7.1.1各数据表说明表3 数据表描述表编号数据表名称类型内容01Login辅助表记录管理员帐号,密码02Customer主表记录订户信息03Diretory主表记录目录
12、信息04Order主表记录订单基本信息05OrderDetail主表记录详细订单项信息7.1.2数据库创建在Microsoft SQL Server 2000的企业管理器中完成数据库和数据表的创建,具体SQL脚本请参见附录Newspaper_booking_system.sqlCREATE TABLE dbo.Customer (Cid varchar (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,Cname varchar (20) COLLATE Chinese_PRC_CI_AS NULL ,Phone varchar (15) COLLATE Chi
13、nese_PRC_CI_AS NULL ,Address varchar (50) COLLATE Chinese_PRC_CI_AS NOT NULL ) ON PRIMARYGOCREATE TABLE dbo.Login (UName varchar (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,UPassword varchar (20) COLLATE Chinese_PRC_CI_AS NOT NULL ) ON PRIMARYGOCREATE TABLE dbo.Diretory (Did varchar (10) COLLATE Chines
14、e_PRC_CI_AS NOT NULL ,Dname varchar (20) COLLATE Chinese_PRC_CI_AS NULL ,UnitPrice float NOT NULL ,Ifo varchar (50) COLLATE Chinese_PRC_CI_AS NULL ) ON PRIMARYGOCREATE TABLE dbo.Order (Ono varchar (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,Cid varchar (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,Odate dat
15、etime NULL ) ON PRIMARYGOCREATE TABLE dbo.OrderDetail (Ono varchar (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,Did varchar (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,Quantity int NOT NULL ,QiShu int NOT NULL ,UnitPrice float NOT NULL ,Total float NULL ) ON PRIMARYGO7.2数据库备份和恢复方案7.2.1应用辅助工具进行备份和恢复应用数据库辅助工
16、具(如sqlbackuptools)进行备份,选择所需要备份的数据库和目标地址即可进行数据备份,恢复数据库只需要指定备份文件和需要恢复的数据库即可进行数据恢复。7.2.2分离数据库法在企业管理器中右击需要备份的数据库,选择“所有任务”,“分离数据库”,执行分析操作,拷贝数据库MDF文件和LDF文件。恢复方案:在企业管理器的控制台树中选择“数据库”节点,右击,“所有任务”,“附加数据库”,找到待恢复数据库的MDF文件,确定。7.3用户界面设计和应用程序编码7.3.1用户界面设计本系统的用户界面用Java Swing编写,主要由1个主界面Newspaper.java和10个辅助对话框组成。主界面集
17、合系统主要基本功能按键,辅助对话框负责采集用户输入信息和做基本的信息处理。图11: 用户界面7.3.2类文件功能描述NO.类名类型功能01NewspaperFrame主窗口类,提供系统主要功能的调用接口02Utilities辅助类封装系统主要数据和方法,为其它类提供信息处理功能03AdminCreateDlgDialog管理员创建对话框,提供管理员创建功能04AdminModifyDlgDialog管理员信息修改对话框,修改管理员密码,删除管理员05UserCreateDlgDialog订户新建对话框,采集订户信息,创建新订户06UserModifyDlgDialog订户修改对话框,提供订户修
18、改、删除操作07DirCreateDlgDialog目录新建对话框,采集目录信息,创建新目录08DirModifyDlgDialog目录修改对话框,提供目录修改、删除操作09BookingDlgDialog添加订单对话框,提供新订单添加功能10OrderSearchDlgDialog订单查找对话框,提供按Ono或Cid查找订单操作11OrderDetailDlgDialog订单细节对话框,显示订单细节,提供订单和订单项删除操作,并能通过调用DetailModifyDlg对话框完成订单项修改。12DetailModifyDialog订单项修改对话框,提供订单项修改操作13LoginDlgDial
19、og管理员登陆对话框,提供登陆界面,检查登陆信息表4:类文件描述表7.3.3主要代码分析/-/所属类:Utilities/功能:取得应用程序与数据库系统的连接public static void getConnection() throws Exception Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver).newInstance();/加载驱动程序String url = jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=Newspaper;String user
20、 = sa;String password = ;conn = DriverManager.getConnection(url, user, password);/取得连接stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);/创建语句conn2 = DriverManager.getConnection(url, user, password);stmt2 = conn2.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,Re
21、sultSet.CONCUR_UPDATABLE);/-/所属类:Utilities/功能:完成查询结果的表格显示public static void displayResultSet(JTable table, ResultSet rs)throws SQLException rs.beforeFirst();/ 指针移到结果集第一条记录前面boolean moreRecords = rs.next();if (!moreRecords) / 如果没有记录,则提示一条消息JOptionPane.showMessageDialog(table, 无相关记录, Check your input!
22、,JOptionPane.ERROR_MESSAGE);return;Vector columnHeads = new Vector();/ 用于存储表格字段Vector rows = new Vector();/ 用于存储记录行try / 获取字段的名称ResultSetMetaData rsmd = rs.getMetaData();for (int i = 1; i = rsmd.getColumnCount(); +i)columnHeads.addElement(rsmd.getColumnName(i);do / 获取记录集rows.addElement(getNextRow(rs
23、, rsmd); while (rs.next();/ 建立相应的TableModel,并将TableModel应用到table中显示出来DefaultTableModel model = new DefaultTableModel(rows, columnHeads);table.setModel(model);return; catch (SQLException sqlex) sqlex.printStackTrace();/-/所属类:Utilities/功能:被displayResultSet(JTable table, ResultSet rs)调用, 返回一个记录行private
24、 static Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd)throws SQLException Vector currentRow = new Vector();for (int i = 1; i = rsmd.getColumnCount(); +i)currentRow.addElement(rs.getString(i);return currentRow; / 返回一条记录/-/所属类:Utilities/功能:创建空白EXCEL文件,并将统计查询结果导出到该EXCEL文件/说明:使用到org.apache的POI包
25、,表示感谢public static boolean outPut(ResultSet rs, File file) if (rs = null)return false;try HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet(first sheet);sheet.setDefaultColumnWidth(short) 20);ResultSetMetaData metadata = rs.getMetaData();int columnCount = metadata.getColumnCount(
26、);/ 获取属性列数HSSFRow row = sheet.createRow(short) 0);for (int i = 1; i = columnCount; i+) / 填写表格列名row.createCell(short) (i - 1).setCellValue(metadata.getColumnName(i);/ 按行填写记录rs.beforeFirst();short counter = 1;while (rs.next() row = sheet.createRow(counter+);for (int i = 1; i 1) / 容器第一个空间放插入Order的sql语句
27、,其它空间放插入OrderDetail的sql语句 / sqls.size()=1表示只有一张空订单,不予插入int ans = JOptionPane.showConfirmDialog(dialog, 一共需要支付订金:+ sum + 元nContinue?, We need your money,JOptionPane.YES_NO_CANCEL_OPTION);if (ans = JOptionPane.YES_OPTION) try for (int i = 0; i sqls.size(); i+) / 顺序取出sql语句,完成订单添加插入Utilities.stmt.executeUpdate(sqls.get