1、数据库系统课程设计仓库管理系统实验报告仓库管理系统实验课程数据库实验实验者1姓名班级学号实验者2姓名班级学号实验时间指导老师目录P3 要求 P4 参考资料阅读心得P6概述(设计思路、实现功能、运用技术)P7 实现及操作(关键代码解析、运行结果、类方法的介绍)P17存在问题和需要改进的地方P18附录(完整代码 包括 分布调试代码)要求:使用ACCESS、SQL SERVER、ORACLE、MYSQL等作后台数据库,选择ASP、VB、VC、JAVA等作为前台开发工具设计一个小型管理系统。所设计的小型管理系统应包含输入输出、查询、插入、删除等基本功能,功能越强大越好。根据题目的基本需求,设计数据库、
2、编写程序,并写出详细的设计说明书。每班以2人为一组自由分组,由班长将分组情况报到指导教师处;需要提交的文档资料:设计说明书每人一份(包括:参考资料的阅读心得,功能需求说明,设计思路,数据表结构及作用,数据关系图,存储过程代码及相关注释,设计体会);电子文档:可运行的,能实现全部或者主要基本功能的小型系统。课程设计说明书编写规范 : a. 需求分析:题目要求达到的功能,所提供的原始数据,需要输出的数据及样式等。b. 数据库设计:根据要求设计数据库的结构,包括:表、数据完整性、关系、视图。c. 开发方案选择:主要是前端开发平台的选择与方案的比较,至少比较两套方案。d. 安全性设计:登录用户、数据库
3、用户、数据库角色、命令许可等方面。e. 前台应用程序设计:要求至少完成经过前台程序实现对后台数据库的数据查询、插入、删除与更新。涉及到数据的所有操作要求采用存储过程的方式进行。f. 附录或参考资料:参考资料来源,阅读心得。参考资料阅读心得:参考资料(老师提供):2、 教材信息数据库高校的教材管理需要相应的数据库环境,请根据如下系统需求定义数据表结构及关系,并经过编写存储过程来实现其中的两项功能:1)、教材出入库(1)教材入库将教材内部识别号、入库时间,入库数,适用对象等信息输入到教材入库记录表中,并更新在库教材信息表。教材入库后把教材征订单相应项目做教材收到标记。(暂不处理订单中某教材只入库其
4、中一部分的情况,即缺货情况。)(2)教材出库教师或学生或班级或其它人员领用教材,需要把教材内部编号,教材代号,出库时间,出库数量,使用单位(指班级或教师,可多个班级或教师),用途,经办人等信息输入到教材出库记录表中。并同时更新教材信息表中的在库数量。为便于教材信息的录入,可经过班级名称、课程名称或教材名称查询到要出库的教材信息表中相应教材的内部编号。(3)教材信息录入将教材的内部识别号(由本系统自动维护),代号,书名,编著者,出版社,版次,定价,入库时间,入库数,适用对象等信息录入到系统的数据库中。2)、教材查询(1)在库教材查询查询教材在库情况:可按书名、代号等查询, 可查询某班级使用的教材
5、及在库数量,可查询某课程使用的教材及在库数量。可查询指定教材的在库数量,价值总额。可查询教材在库的统计信息:在库教材总数、种类总数、价值总额。(2)教材出库查询教材出库信息查询:按教材代号等信息查询教材出库情况,可查询某使用对象(包括班级、教师、部门、其它人员)的教材出库情况。可查询某时间范围内(学期、年等)的教材出库情况。(3)教材历史查询查询指定书的在库及出入库的历史信息,也可按时间或时间范围查询教材入库情况。便于管理员掌握教材出入库情况。3)、教材订购(1)、生成教材订单根据输入的各专业班级课程教材选用信息、教材出版社信息生成订单。(2)、教材订单状态管理订单状态管理:可标记各订单为有效
6、(款项发出),图书入库后标记订单为到货,图书退回标记为退换货。4)、教材订单查询可查询指定学期教材订单的到货、缺货情况,查询订单未到教材的订货公司信息包括它的银行帐号、地址、联系人、联系方法等,以便与其联系。5)、其它相关数据:学生相关、课程相关、教师相关、班级相关、系部相关阅读心得 :我们的选题是仓库管理系统,和教材信息数据库大致相同,实现的功能略作添加;我们需要完成的任务:(1).这个实验本质就是设置合理的操作界面,实现对数据库的数据读取、修改、删除、更新等操作;(2). 系统的完备性和操作的安全性,是完善软件的关键,其中包括:插入相同信息 ;数据库中物品数量不足 ;管理员编号不存在 ;安
7、全登录 ;不同角色的对数据库的操作权限 ;等等问题,都是我们需要解决的基本问题;(3) 界面的美化和操作的快捷性和正确性 ;界面是给客户的第一感触,尽量的新颖而且符合客户要求 :(这里我们是学习,争取掌握多一点处理界面的函数,没有系统的规划) 如果美化界面是尽量的完善,那么操作的快捷性和正确性是必须要实现的,给客户一个合理的操作是成功的必备条件;(4) 分工与合作我们两个人都是java的初级学习者,不断的学习,分别设计不同的界面,相互交流实现效果的的经验;关于数据库的知识和SQL语言的学习,都是我们要重新学习的;(5) 文档的处理和制作,也是我们要完成的重要任务,我们也是分工完成;概述1.设计
8、思路:(1)仓库管理系统,实现功能:入库登记 : 商品入库记录;出库登记 : 库存商品出库;在库商品查询 : 库存物品查询;出库入库信息查询 : 按时间,操作管理员查询操作信息;管理员信息管理 : 管理员的登记,查询,删除;(2).附加实现功能:登录界面 : 实现管理员员和客户的不同角色登录;界面的转换 : 分别创立不同的窗口,并及时删除浏览过的窗口;分角色设定使用权限: 管理员和客户的使用权限不同;(3).异常处理:操作错误 : 信息输入错误等;常规错误 : 仓库物品数量不足等;2.运用技术:(1) 界面实现 : java语言;(2) 数据路操作实现 :使用Access ,运用SQL语言进行
9、操作;实现及操作根据分析,一共设计9个类,如下图,其中:数据库操作类:DBAccess :实现连接,查询修改等分步操作 ;GetDBInfo :实现查询结果集的返回 ;操作界面类:Enter :登录界面Select : 功能选择界面InStoreHouse : 物品入库操作界面OutStoreHouse : 物品出库操作界面SearchGoods : 物品查询界面OutIn :出入库查询界面ManagerInfo : 管理员信息管理界面分步实现说明:1. DBAccess类public Statement getStatement(String dbPath) throws Exception
10、:返回连接数据库的状态 ;public ResultSet executeQuery(Statement stmt,String query) throws Exception :返回查询结果集;public void executeUpdate(Statement stmt,String query) throws SQLException :更新数据库 ;public void close() throws SQLException :关闭数据库的连接 ;2. GetDBInfo类private VectorVector rows ; 记录查询返回元组private Vector colu
11、mnHeads ; 记录查询返回结果的标题 /获取表头VolumnHeadspublic Vector getColumnHeads() ;/获取表中内容public Vector getRows() ;/ 更新数据库 public void executeUpdate(Statement stmt,String query) throws SQLException ; 3. Enter类private JFrame frame ;private JButton enterButton ;private JButton resetButton;用于标识登陆角色的单选按钮private JRad
12、ioButton radioButton1 ;private JRadioButton radioButton2 ;private JTextField nameText ;private JPasswordField passwordText ;表示登录身份:public static boolean isManager = false ;实现效果:基本实现:(1)图片载入:JLabel label4 = new JLabel(); ImageIcon icon = new ImageIcon(E:studyjavaworkspaceStoreHouseabc.jpg);label4.set
13、Icon(icon);(2)单选按钮:ButtonGroup group = new ButtonGroup();radioButton1 = new JRadioButton(管理员,false);radioButton2 = new JRadioButton(客户,true);group.add(radioButton1) ;group.add(radioButton2) ;4. InStoreHouse类基本成员变量:private JFrame frame ;输入信息的11个文本框:private JTextField text1 - 11; private JTextField in
14、foText ;private JButton okButton ;private JButton backButton ;设置日期格式:private static final String YYYMMDDHHMMSS = yyyy/MM/dd HH:mm:ss;基本函数:/SQL语句生成public String getSQL()/自动生成插入时间 public String insertTime()/自动生成入库IDpublic String inHouseID()/清除文本框public void clear()实现效果:基本功能实现:监听器的设定:public void action
15、Performed(ActionEvent e) Object source = e.getSource() ; if(source = okButton) try DBAccess db=new DBAccess(); String dbPath=E:studyjavaworkspaceStoreHouseStoreHouse.mdb; Statement stmt=db.getStatement(dbPath); String query = getSQL(); db.executeUpdate(stmt,query) ; query = insertSQL() ; db.executeU
16、pdate(stmt,query) ; stmt.close(); db.close() ; infoText.setText(存储成功); clear() ; catch (Exception ex) ex.printStackTrace() ; else if(source = backButton) frame.dispose() ; new Select() ; 5. OutStoreHouse类基本成员变量:private JFrame frame ;private JButton okButton ;private JButton backButton ;private JText
17、Field text1;private JTextField text2;private JTextField text3;private JTextField text4;private static final String YYYMMDDHHMMSS = yyyy/MM/dd HH:mm:ss;private Integer num ; /修改数据里中数量的临时变量基本函数:同InStoreHouse雷同实现效果:基本功能实现:处理物品编号不存在,以及数量不足的问题:public void actionPerformed(ActionEvent e)Object source = e.g
18、etSource() ;if(source = okButton)tryDBAccess db=new DBAccess(); String dbPath=E:studyjavaworkspaceStoreHouseStoreHouse.mdb; String query=getGoodsSQL(); Statement stmt=db.getStatement(dbPath); ResultSet rs=db.executeQuery(stmt, query); if(!(rs.next()/判断数据库中是否有内容JOptionPane.showMessageDialog(null, 输入货
19、物编号不存在, 提示信息,JOptionPane.INFORMATION_MESSAGE);text3.setText(操作失败);clear() ;else/判断仓库物品是否够/这里实验了很多次 为什么 只有num = 放在这里才能够呢if(num = Integer.valueOf(rs.getString(1).intValue() - Integer.valueOf(text2.getText().intValue() 0)JOptionPane.showMessageDialog(null, 仓库货物不足, 提示信息,JOptionPane.INFORMATION_MESSAGE);
20、clear() ;text3.setText(操作失败);elsequery = getSendOutSQL() ;db.executeUpdate(stmt, query) ;query = updateGoodsSQL(num) ;db.executeUpdate(stmt, query) ;text3.setText(操作成功); stmt.close() ; db.close() ; catch (Exception ex) ex.printStackTrace() ; else if(source = backButton)frame.dispose() ;new Select()
21、;解析:这里应用到数据类型的转变,String 到int double的转化;还能够应用其它方法:如: rs.getInt(3); 直接读取数据库中的 int类型; rs.getDouble(4) :直接读取double类型6. SearchGoods类基本成员函数:private JFrame frame ;private JScrollPane jsp ;private JComboBox nameList ;private JComboBox typeList ;private JComboBox productList ;private JTextField countText ;pr
22、ivate JTextField valueText ;private JButton okButton ;private JTable table ;private DefaultTableModel model ;private JButton backButton ;private Vector rows; /表行值private Vector columnHeads;/ 表列名/查询使用 :String str1,str2,str3 ;基本函数实现相同;实现效果:7. OutIn类基本函数变量:private JFrame frame ;private JRadioButton inB
23、utton ;private JRadioButton outButton;private JButton okButton ;private JButton backButton ;private JComboBox combox1 ;private JComboBox combox2 ;private JTable table ;private Vector rows; /表行值private Vector columnHeads;/ 表列名private DefaultTableModel model ;private JScrollPane jsp ;privateString str
24、1 = null ,str2 = null ; /查询使用private boolean flag = false ;private int tmp = 0 ;private static final String YYYMMDDHHMMSS = yyyy/MM/dd;实现效果:基本实现:时间字符创的分割处理 ;8. Select类基本成员变量private JButton button1 ;private JButton button2 ;private JButton button3 ;private JButton button4;private JButton button5 ;pri
25、vate JButton button6 ;private JTextField Text ;private JFrame frame ;实现效果:基本实现:界面效果实现:infoLabel.setHorizontalAlignment(SwingConstants.CENTER); infoLabel.setBackground(Color.gray) ;Text.setBackground(Color.gray) ;Text.setForeground(Color.cyan) ;Text.setFont(new Font(宋体,Font.HANGING_BASELINE,20);9. Ma
26、nagerInfo 类 基本函数:private JFrame frame ;private JTabbedPane tabbedPane ;private JLabel label1 ;private JLabel label2 ;private JLabel label3 ;private JPanel panel1 ;private JPanel panel2 ;private JPanel panel3 ;private JComboBox ageBox ;private JComboBox workAgeBox ;private JComboBox postionBox ;priva
27、te JTextField text21 ;private JTextField text22 ;private JTextField text23 ;private JTextField text24 ;private JTextField text25 ;private JTextField text26 ;private JTextField text27 ;private JTextField text28 ;private JTextField text31 ;private JTextField text32 ;private JButton button11 ;private J
28、Button button12 ;private JButton button21 ;private JButton button31 ;private JButton backButton ;private JTable table ;private Vector rows; /表行值private Vector columnHeads;/ 表列名private DefaultTableModel model ;private JScrollPane jsp ;privateString str1= null,str2 = null ,str3 = null ; /查询使用基本功能函数:这里
29、的函数处理和上面的相同,只是在布局上采用了JtablePanle面板,将三个功能加在同一个窗口里;实现效果:处理问题:要删除的管理员信息不存在:if(source = button31)boolean deleteState = false ;try DBAccess db=new DBAccess(); String dbPath=E:studyjavaworkspaceStoreHouseStoreHouse.mdb; String query = select * from Manager where 编号 = + + text31.getText() + ; Statement stm
30、t=db.getStatement(dbPath); ResultSet rs=db.executeQuery(stmt, query); while(rs.next() if(rs.getString(1).equals(text31.getText() query = delete from Manager where 编号 = + + text31.getText() + ; db.executeUpdate(stmt,query) ; text31.setText(); text32.setText(删除成功); deleteState = true ; stmt.close(); d
31、b.close() ; catch (Exception ex) ex.printStackTrace() ; if(deleteState = false) text32.setText(输入编号不存在); text31.setText(); 解析:在删除之前,对数据库进行检查,判断 管理员编号 是否存在 ;存在问题和需要完善的问题附录 : 代码实现DBAccess.Java文件import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLExcept
32、ion;import java.sql.Statement;public class DBAccess public Connection conn=null; / 连接未加密的数据库 public Statement getStatement(String dbPath) throws Exception Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); String dburl = jdbc:odbc:driver= Microsoft Access Driver (*.mdb); + DBQ=+dbPath;/ 此为NO-DSN方式 / Strin
33、g dburl =jdbc:odbc:odbcName;/此为ODBC连接方式 conn = DriverManager.getConnection(dburl); return conn.createStatement(); /连接加密的数据库 public Statement getStatement(String dbPath,String password) throws Exception Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); String dburl =jdbc:odbc:driver=Microsoft Access Drive
34、r (*.mdb); + pwd=+password+;DBQ=+dbPath;/ 此为NO-DSN方式 / String dburl =jdbc:odbc:odbcName;/此为ODBC连接方式 conn = DriverManager.getConnection(dburl); return conn.createStatement(); /* 查询数据库 */ public ResultSet executeQuery(Statement stmt,String query) throws Exception ResultSet rs=stmt.executeQuery(query);
35、 return rs; /* * 更新数据库 */ public void executeUpdate(Statement stmt,String query) throws SQLException stmt.executeUpdate(query); /* * 关闭链接 */ public void close() throws SQLException if(conn!=null) conn.close(); public static void main(String args) throws Exception DBAccess db=new DBAccess(); String d
36、bPath=E:studyjavaworkspaceStoreHouseStoreHouse.mdb; String query=select * from Manager; Statement stmt=db.getStatement(dbPath); ResultSet rs=db.executeQuery(stmt, query); while(rs.next() System.out.println(rs.getString(1) + t + rs.getString(2) + t + rs.getString(3) + t + rs.getString(4) + t + rs.get
37、String(5) + rs.getString(6) + rs.getString(7); Enter.java文件import javax.swing.*;import java.awt.event.*;import java.awt.*;import java.sql.ResultSet;import java.sql.Statement;public class Enter implements ActionListenerprivate JFrame frame ;private JButton enterButton ;private JButton resetButton;pri
38、vate JRadioButton radioButton1 ;private JRadioButton radioButton2 ;private JTextField nameText ;private JPasswordField passwordText ;public static boolean isManager = false ;public Enter()frame = new JFrame(仓库管理系统登录界面);enterButton = new JButton(登录);resetButton = new JButton(重置);JLabel label1 = new J
39、Label(用户名 :);JLabel label2 = new JLabel(密 码 :);JLabel label3 = new JLabel(登录方式 :);JLabel label4 = new JLabel();JLabel label5 = new JLabel();JLabel label6 = new JLabel();JLabel label7 = new JLabel();ImageIcon icon = new ImageIcon(E:studyjavaworkspaceStoreHouseabc.jpg);label4.setIcon(icon);label5.setT
40、ext(华润品牌);label7.setText(追求卓越);label6.setText(中心软件,让您选择无悔的软件,感谢支持 晓伟O(_)O制作);nameText = new JTextField();passwordText = new JPasswordField();/单选按钮ButtonGroup group = new ButtonGroup();radioButton1 = new JRadioButton(管理员,false);radioButton2 = new JRadioButton(客户,true);group.add(radioButton1) ;group.a
41、dd(radioButton2) ;/* * 字体等格式设置 */label1.setHorizontalAlignment(SwingConstants.CENTER); label2.setHorizontalAlignment(SwingConstants.CENTER);label3.setHorizontalAlignment(SwingConstants.CENTER);label5.setHorizontalAlignment(SwingConstants.CENTER) ;label6.setHorizontalAlignment(SwingConstants.CENTER) ;label1.setFont(new Font(宋体,Font.HANGING_BASELINE,30);lab