《数据库系统概论》课程设计
实验报告书
2017年 6月 5日
姓 名
专 业 班 级
学 号 指导教师
摘要
摘要:
将商品信息、客户信息、供应商信息并将之间的交易信息存储在数据库表中,使用C#语言建立数据库图形化软件,根据不同的要求对数据库进行查询,如:根据查找了解仓库库存等。
关键词:客户、供应商、商品、进货、销售、库存、员工。
目录
1 绪论 (7)
1.1 概述 (7)
1.1.1 问题的提出 (7)
1.1.2 本课题的意义 (7)
1.2 开发环境与工具介绍 (7)
1.2.1 https://www.sodocs.net/doc/6410061864.html,简介 (7)
1.2.2超市管理系统研究状况 (7)
2 系统需求分析与设计 (4)
2.1 用户需求分析 (4)
2.1.1 用户需求 (4)
2.1.2 系统功能需求 (4)
2.1.3 系统性能需求 (4)
2.2 功能模块图及分模块功能描述 (4)
2.2.1 系统的功能模块图 (5)
2.2.2 系统功能模块简介 (5)
2.3 数据库设计 (6)
2.3.1 系统E-R图 (6)
2.3.2 数据库逻辑结构设计 (6)
3 系统实施 (7)
3.1 建立数据库 (7)
3.2 数据库连接 (9)
3.3 主要模块实施 (9)
3.3.1 登录模块的开发 (9)
3.3.2 修改密码功能模块 (11)
3.3.3 主界面及管理功能实现 (11)
3.4 系统测试 (134)
3.4.1 软件测试的对象 (344)
3.4.2 软件测试的结果 (344)
4 系统说明 (39)
4.1 开发环境 (39)
4.2 系统安装、配置与发布应用程序的步骤 (39)
总结 (40)
参考文献 (41)
1 绪论
1.1 概述
1.1.1 问题的提出
在小超市的日常运营中缺乏对员工及货品的有效管理,收银过程中的不方便和账单的可靠性低是普遍问题,本课题是针对小超市的日常管理进行系统化的设计以及实现来进行的。
1.1.2 本课题的意义
理论上可以有效地提高超市管理者的管理效率,有助于小型超市在当代社会中具有一定的生存能力。本系统的具体可以对员工,商品,会员,供货商的信息及各种交易的时间,数量,价格进行有效管理的能力。
1.2 开发环境与工具介绍
Oracle 10g: Oracle 10g是第一套具有无限伸缩性与高可用性,并可在集群环境中运行上商业软件的互联网数据库,具有400多个领先的数据库功能,在集群技术、高可用性、商业智能、安全性、系统管理等方面都实现了新的突破。真正应用集群技术能够提供近乎无限的扩充能力与整体可用性,为用户带来透明的、高速增长的集群功能。
VS2015:window平台图形化界面开发工具,方便使用C#开发图形界面。将数据库操作结果直观明了的展示给用户。方便非计算机专业人员使用。
1.2.1 https://www.sodocs.net/doc/6410061864.html,简介
https://www.sodocs.net/doc/6410061864.html,的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于在以往的Microsoft技术中访问数据。之所以使用https://www.sodocs.net/doc/6410061864.html,名称,是因为Microsoft希望表明,这是在NET编程环境中优先使用的数据访问接口。
https://www.sodocs.net/doc/6410061864.html,可让开发人员以一致的方式存取资料来源(例如SQL Server与XML),以及透过OLE DB和ODBC所公开的资料来源。资料共用的消费者应用程序可使用https://www.sodocs.net/doc/6410061864.html, 来连接至这些资料来源,并且撷取、处理及更新其中所含的资料。
1.2.2 超市管理系统研究状况
能够更好的促进经济发展和交流。而随着各种小超市的不断兴起,对仓库,对商品的管理成为一个很重要的问题。随着现代科技的发展,自动化办公逐渐进入人们的日常生活,利用新时代计算机技术,可以帮助我们更好地管理超市。
2 系统需求分析与设计
2.1 用户需求分析
2.1.1 用户需求
目前大多数小型超市都配有收银系统,但超市的管理上并没有一个成型的系统来进行管理,所以目前小型超市管理系统还是有一定的市场需求的。
本系统的用户为超市管理者,根据从超市方面取得的图标资料、文字资料以及其他细节方面的信息,得出用户的下列实际要求:
超市管理分为四部分:商品、客户、员工和供应商。同时根据交易可得出商品的入库纪录和销售纪录,从而得出库存。
管理员根据交易单可对超市仓库中商品进行增加和减少的操作,也可以根据超市对应的客户和供应商的信息进行修改和删除等操作。
2.1.2 系统功能需求
1.会员信息:会员编号、会员名称、会员积分、联系方式、客户地址
2.供应商:供应商编号、供应商名称、地址、联系方式
3.商品信息:商品编号、商品名称、价格、库存数量、供货商编号
4.入库信息:入库号、商品编号、数量、进货时间、进货单价、总价
5.销售信息:销售号、商品编号、数量、销售时间、总价
管理员进入系统可根据最近的的进货单号对数据库信息进行录入,也可以对销售单进行录入,并查看库存。
2.1.3 系统性能需求
因为本课题是针对小超市来进行设计的,所以要做到事务的精细化管理,而且,根据小超市的日销售额,并不需要好几台收银机同时工作,所以不需要实现多线程来控制共享资源。
2.2 功能模块图及分模块功能描述
2.2.2 系统功能模块简介
1.人事管理系统:可以对超市员工进行管理,分配权限,以及管理者的密码管理;
2.商品管理系统:完善商品信息,对商品表进行增加、修改、删除的操作;
○1入库信息管理:可以对商品进行入库操作,并自动修改商品库存;
○2商品信息管理:可以对商品的单价,供货商,库存等进行查询;
○3日销售额管理:根据这个模块可以将每日的销售情况反馈给超时的管理者;3.会员管理系统:对会员用户的购买积分,购买商品时间,数量进行记录及管理。
2.3 数据库设计
2.3.1 系统E-R图
2.3.2 数据库逻辑结构设计
用户表:用户编号,密码,用户类型,用户名,性别,联系方式会员表:会员号,会员积分,地址,注册电话,注册时间
商品表:商品编号,商品名,商品价格,商品库存,供货商编号销售表:销售编号,商品编号,数量,总价格,销售时间
交易表:用户编号,交易编号,交易时间,数量,总价格
部门表:部门编号,部门名,所属部门编号,部门类型
入库表:入库编号,入库时间,商品名,入库数量,单价,总价格供货商表:供货商编号,供货商名,地址,联系方式
3 系统实施
3.1 建立数据库
1.商品信息表
create table goods
(
GNo char(6) primary key,
GName varchar(40) not null,
GPrice number(8,2) not null,
GDanwei varchar(6) not null,
GKucun int not null,
Gkuncun_danger int not null,
providerID char(4) not null, //外键
constraint fk_goods_provider foreign key(providerid) references userx(providerid) );
2.员工表
create table userx
(
userNo char(4) primary key,
userName varchar(8) not null,
userPassword varchar(14),
userStyle int not null, //外键
userSex char(2) not null,
userCell varchar(11) not null
);
//设置外键,并实现级联删除
Alter table userx
add constraint fk_bm_user
foreign key(userstyle)
references bm(jid)
on delete cascade;
3.会员表
create table vip
(
VNo char(6) primary key,
VName varchar(8) not null,
VAdress varchar(40) not null,
VJifen number(8,2) default 0,
VTime date not null,
VCell varchar(11) not null
);
4.销售记录表
create table sale
(
SNo char(7) primary key,
GNo char(6) not null,
SCount int not null,
SSum number(8,2) not null,
SDate date not null
);
5.供货商表
create table provider
(
providerID char(4) primary key,
providerName char(40) not null,
providerADRESS char(50),
providerCELL varchar(11),
);
6.入库表
create table Stock
(
StockNo varchar(14) primary key,
GNo char(6) not null, //外键SGNum int not null,
SGPrice number(8,2) not null,
SGTotal number(10,2) not null,
StockDate date not null
);
//添加外键约束
Alter table stock
add constraint fk_stock_goods foreign key(Gno) references goods(Gno);
7.交易表
create table deal
(
DNo char(6) primary key,
DSum number(8,2) not null,
VNo char(6),
DDate date not null,
userNo char(4) not null, //外键
constraint fk_deal_userx foreign key(userNo) references userx(userNo) on delete cascade
);
8.部门表
create table bm
(
JId int primary key,
JName varchar(8) not null,
JPar int not null,
JPro varchar(4) not null
);
3.2 数据库连接
class OracleLJ
{
//连接字符串
public static string cstr = "User ID=scott;Password=199510;Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SERVICE_NAME = orcl)));";
//建立连接
public static OracleConnection conn = new OracleConnection(cstr);
}
3.3 主要模块实施
3.3.1 登录模块的开发
public partial class Form1 : Form
{
public static string sql = "select * from userx where userNo=:name";
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
label_message.Text = "";
try
{
OracleLJ.conn.Open();
using (OracleCommand cmd = new OracleCommand(sql, OracleLJ.conn))
{
cmd.Parameters.Add(":name", textBox_name.Text.Trim());
using (OracleDataReader dr = cmd.ExecuteReader())
{
if (dr.HasRows)
{
dr.Read();
if (dr["userstyle"].ToString().Equals("6") || dr["userstyle"].ToString().Equals("7") || dr["userstyle"].ToString().Equals("8"))
{
if
(textBox_pw.Text.Trim().Equals(dr["userPassword"].ToString()))
{
Form f = new sale(dr["userName"].ToString(), dr["userNo"].ToString(),Int32.Parse(dr["userstyle"].ToString()));
OracleLJ.conn.Close();
f.Owner = this;
this.Hide();
f.Show();
}
else
label_message.Text = "密码错误!";
}
else
label_message.Text = "用户无权限!";
}
else
{
label_message.Text = "用户名不存在!";
}
}
OracleLJ.conn.Close();
}
}
catch (Exception ex)
{
label_message.Text = "连接数据库失败!";
}
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
OracleLJ.conn.Open();
OracleCommand cmd = new OracleCommand(sql, OracleLJ.conn);
cmd.Parameters.Add(":name", textBox_name.Text.Trim());
OracleDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
if(dr["userstyle"].ToString().Equals("6") || dr["userstyle"].ToString().Equals("7") || dr["userstyle"].ToString().Equals("8"))
{
Form pc = new pwdCH(textBox_name.Text);
pc.Show();
}
else
{
label_message.Text = "用户无权限!";
}
}
else
label_message.Text = "用户名不存在!";
OracleLJ.conn.Close();
}
}
3.3.2 修改密码功能模块
public partial class pwdCH : Form
{
string user_id;
public pwdCH(string o)
{
user_id = o;
InitializeComponent();
}
private void button_ok_Click(object sender, EventArgs e)
{
label_error.Text = "";
string sql = "select * from userx where userNo=" + user_id;
try
{
OracleLJ.conn.Open();
OracleCommand cmd = new OracleCommand(sql, OracleLJ.conn);
OracleDataReader dr = cmd.ExecuteReader();
dr.Read();
if (textBox_old.Text.Trim().Equals(dr["userPassword"].ToString()))
if (textBox_new.Text.Trim().Equals(textBox_newch.Text.Trim())) {
https://www.sodocs.net/doc/6410061864.html,mandText = "update userx set userpassword=:pwd where userNo=" + user_id;
cmd.Parameters.Add(":pwd", textBox_newch.Text.Trim());
cmd.ExecuteNonQuery();
this.Close();
MessageBox.Show("密码已修改");
}
else
{
label_error0.Text = "两次密码不一致";
textBox_new.Clear();
textBox_newch.Clear();
}
}
else
{
label_error.Text = "密码不正确";
textBox_old.Clear();
}
OracleLJ.conn.Close();
}
catch (Exception ex)
{
MessageBox.Show("密码修改失败:"+ex);
}
}
}
3.3.3 主界面及管理功能实现
1.用户登录权限模块
public sale(string username,string userNo,int s)
{
name = username;
No = userNo;
sign_style = s;
InitializeComponent();
}
protected override void OnClosing(CancelEventArgs e)
{
if(sign==0)
Application.Exit();
{
sign = 0;
}
}
private void sale_Load(object sender, EventArgs e)
{
label_clerkX.Text = name;
label_clerkNOX.Text = No;
if(sign_style==8)
{
tabPage2.Parent = null;
tabPage4.Parent = null;
tabPage5.Parent = null;
tabPage6.Parent = null;
tabPage7.Parent = null;
}
else if(sign_style == 6)
{
tabPage1.Parent = null;
tabPage2.Parent = null;
tabPage3.Parent = null;
tabPage5.Parent = null;
}
Addparent();
//给部门下拉框添加数据源
string select_BMname = "select jname from bm where jpro='部门'";
using (OracleConnection conn = new OracleConnection(OracleLJ.cstr)) {
conn.Open();
OracleDataAdapter da = new OracleDataAdapter(select_BMname, OracleLJ.conn);
DataSet ds = new DataSet();
da.Fill(ds);
comboBox_bm.DisplayMember = "jname";
comboBox_bm.DataSource = ds.Tables[0];
comboBox_bm.SelectedIndex = -1;
}
}
2.收银界面功能模块
private void button1_Click(object sender, EventArgs e)
{
if (dataGridView1.Rows.Count>0)
{
//更新会员表
double d = Double.Parse(label_total.Text)/100.00;
string sql_upVip = "update vip set vjifen=vjifen+" + d + " where
vno='"+textBox_no.Text.Trim()+"'";
string sql_inSale = "insert into sale(GNo,SCount,SSum,SDate)
values(:GNo,:SCount,:SSum,to_date(:SDate,'YYYY-MM-DD'))";
string sql_selectSale = "select * from sale where GNo=:SGNo and
SDate=to_date(:SSDate,'YYYY-MM-DD')";
OracleLJ.conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = OracleLJ.conn;
if (textBox_no.Text!="")
{
https://www.sodocs.net/doc/6410061864.html,mandText = sql_upVip;
cmd.ExecuteNonQuery();
}
//更新销售表
for(int i=0;i { https://www.sodocs.net/doc/6410061864.html,mandText = sql_selectSale; cmd.Parameters.Add(":SGNo",dataGridView1.Rows[i].Cells[0].Value); cmd.Parameters.Add(":SSDate",DateTime.Now.ToString("yyyy-MM-dd")); OracleDataReader dr = cmd.ExecuteReader(); cmd.Parameters.Clear(); if (dr.HasRows) { https://www.sodocs.net/doc/6410061864.html,mandText = "update sale set SCount=SCount+:count,SSum=SSum+:price where GNo=:GNo and SDate=to_date(:USDate,'YYYY-MM-DD')"; cmd.Parameters.Add(":count", dataGridView1.Rows[i].Cells[3].Value); cmd.Parameters.Add(":price", dataGridView1.Rows[i].Cells[2].Value); cmd.Parameters.Add(":USDate", DateTime.Now.ToString("yyyy-MM-dd")); cmd.Parameters.Add(":GNo", dataGridView1.Rows[i].Cells[0].Value); cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } else { https://www.sodocs.net/doc/6410061864.html,mandText = sql_inSale; cmd.Parameters.Add(":GNo", dataGridView1.Rows[i].Cells[0].Value); cmd.Parameters.Add(":SCount", dataGridView1.Rows[i].Cells[3].Value); cmd.Parameters.Add(":SSum", dataGridView1.Rows[i].Cells[2].Value); cmd.Parameters.Add(":SDate", DateTime.Now.ToString("yyyy-MM-dd")); cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } //在此处加一条处理,即将good表中的库存减少 https://www.sodocs.net/doc/6410061864.html,mandText = "update goods set gkucun=gkucun-" + dataGridView1.Rows[i].Cells[3].Value + "where GNo='"+ dataGridView1.Rows[i].Cells[0].Value+"'"; cmd.ExecuteNonQuery(); } //添加一条到交易表 https://www.sodocs.net/doc/6410061864.html,mandText = "insert into deal(DSum,VNo,DDate,userNo) values(:DSum,:VNo,to_date(:DDate,'YYYY-MM-DD'),:userNo)"; cmd.Parameters.Add(":DSum", label_total.Text); cmd.Parameters.Add(":VNo", textBox_no.Text); cmd.Parameters.Add(":DDate", DateTime.Now.ToString("yyyy-MM-dd")); cmd.Parameters.Add(":userNo", label_clerkNOX.Text); cmd.ExecuteNonQuery(); cmd.Parameters.Clear();//把上一次执行的参数清掉 totalP = 0; totalC = 0; textBox_no.Clear(); dataGridView1.Rows.Clear(); label_total.Text = "0"; label_totalC.Text = "0"; label_nameX.Text = ""; label_jifenX.Text = ""; textBox_luru.Clear(); textBox_count.Text = "1"; OracleLJ.conn.Close(); } else { MessageBox.Show("未添加商品!"); } } private void textBox_count_KeyUp(object sender, KeyEventArgs e) { string sql = "select * from goods where gno='" + textBox_luru.Text.Trim() + "'"; if (e.KeyCode == Keys.Enter) { try { OracleLJ.conn.Open(); using (OracleCommand cmd = new OracleCommand(sql, OracleLJ.conn)) { OracleDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { dr.Read(); DataGridViewRow dv = new DataGridViewRow(); int count = Int32.Parse(textBox_count.Text); totalC += count; int index = dataGridView1.Rows.Add(dv); dataGridView1.Rows[index].Cells[0].Value = dr["gno"].ToString(); dataGridView1.Rows[index].Cells[1].Value = dr["gname"].ToString(); dataGridView1.Rows[index].Cells[2].Value = count * Double.Parse(dr["gprice"].ToString()); dataGridView1.Rows[index].Cells[3].Value = textBox_count.Text; totalP += count * Double.Parse(dr["gprice"].ToString()); label_total.Text = totalP.ToString(); label_totalC.Text = totalC.ToString(); } else MessageBox.Show("数据库中无此商品"); } } catch (Exception ex) { MessageBox.Show("结账失败!"); } } OracleLJ.conn.Close(); } private void textBox_luru_KeyUp(object sender, KeyEventArgs e) { textBox_count_KeyUp(sender,e); } private void textBox_no_KeyUp(object sender, KeyEventArgs e) { string sql = "select * from vip where vno='" + textBox_no.Text.Trim() + "'"; if(textBox_no.Text=="") { MessageBox.Show("请先输入编号!"); } else { try { if (e.KeyCode == Keys.Enter) { OracleLJ.conn.Open(); using (OracleCommand cmd = new OracleCommand(sql, OracleLJ.conn)) { OracleDataReader dr = cmd.ExecuteReader(); dr.Read(); label_nameX.Text = dr["vname"].ToString(); label_jifenX.Text = dr["vjifen"].ToString(); } } OracleLJ.conn.Close(); } catch (InvalidOperationException ex) { MessageBox.Show("查无此人!"); } catch (Exception ex) { MessageBox.Show("查询出错!"); } } } private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { sign = 1; this.Owner.Show(); this.Close(); } 3.会员界面功能模块 private void button_zhuce_Click(object sender, EventArgs e) { string sql_insert = "insert into vip(vname,vadress,vtime,vcell) values(:vname,:vadress,to_date(:vdate,'YYYY-MM-DD'),:vcell)"; try { OracleLJ.conn.Open(); OracleCommand cmd = new OracleCommand(sql_insert, OracleLJ.conn); cmd.Parameters.Add(":vname", textBox_Zname.Text.Trim()); cmd.Parameters.Add(":vadress", textBox_Zadress.Text.Trim()); cmd.Parameters.Add(":vdate", DateTime.Now.ToString("yyyy-MM-dd")); cmd.Parameters.Add(":vcell", textBox_Zcell.Text.Trim()); cmd.ExecuteNonQuery(); MessageBox.Show("注册成功!"); textBox_Zname.Text = ""; textBox_Zadress.Text = ""; textBox_Zcell.Text = ""; OracleLJ.conn.Close(); } catch (Exception ex) { MessageBox.Show("注册失败!"); } } private void button_select_Click(object sender, EventArgs e) { string sql_select = String.Format("select * from vip where 1=1 "); try { OracleLJ.conn.Open(); DataSet ds = new DataSet(); if (textBox_Svno.Text != "") sql_select += String.Format("and vno like '%{0}%' ", textBox_Svno.Text.Trim()); if (textBox_Svname.Text != "") sql_select += String.Format("and vname like N'%{0}%' ", textBox_Svname.Text.Trim()); if (textBox_Svcell.Text != "") sql_select += String.Format("and vcell like '%{0}%' ", textBox_Svcell.Text.Trim()); if (textBox_Svadress.Text != "") sql_select += String.Format("and vadress like N'%{0}%'", textBox_Svadress.Text.Trim()); OracleDataAdapter da = new OracleDataAdapter(sql_select, OracleLJ.conn); da.Fill(ds); if (ds.Tables[0].Rows.Count == 0) { dataGridView2.DataSource=null; MessageBox.Show("查无此人!"); } else { dataGridView2.DataSource = ds.Tables[0]; dataGridView2.Columns[0].HeaderText = "编号"; dataGridView2.Columns[0].ReadOnly = true; dataGridView2.Columns[1].HeaderText = "姓名"; dataGridView2.Columns[2].HeaderText = "地址"; dataGridView2.Columns[3].HeaderText = "积分"; dataGridView2.Columns[4].HeaderText = "注册时间"; dataGridView2.Columns[5].HeaderText = "联系方式"; } OracleLJ.conn.Close(); } catch (Exception ex) { MessageBox.Show("查询失败:" + ex); } } private void button_update_Click(object sender, EventArgs e) { string sql_update = "update vip set "+https://www.sodocs.net/doc/6410061864.html,+"=:name where vno=:vno"; OracleLJ.conn.Open(); OracleCommand cmd = new OracleCommand(sql_update, OracleLJ.conn); //MessageBox.Show(); cmd.Parameters.Add(":name", dataGridView2.CurrentCell.Value); cmd.Parameters.Add(":vno", dataGridView2.CurrentRow.Cells[0].Value); cmd.ExecuteNonQuery(); OracleLJ.conn.Close(); }