数据库课程设计某电力公司收费系统.docx
数据库课程设计题目某电力公司收费管理信息系统专业班级姓名学号完成日期一、课程实验目的1. 通过课程设计,使学生进一步巩固所学的知识,考查学生对数据库理论及知 识的理解能力和综合运用能力;2. 培养学生自主学习、独立思考的能力,学会查找资料并善于分析资料的能力;3. 培养学生独立设计、独立调试程序的能力;4. 培养学生初步的软件设计能力,形成良好的编程风格-、 课程实验要求(28)某电力公司收费管理信息系统1. 实现客户信息、用电类型(类别号、类别名、电价)及业务员管理;2. 实现客户用电信息管理(客户号、月份、用电类别号、用电度数);3. 实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为未收;4. 实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);5. 创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;6. 创建存储过程统计指定月份应收费用和实收费用;7. 创建存储过程查询指定月份未交费的用户信息,以便崔费;8. 创建规则使得月份符合格式“XXXX年XX月”,并邦定到表中相应字段;9. 建立表间关系。三、课程设计要求1. 在对数据库理论及知识理解的基础上;重点是针对具体的实际问题选择并设 计合适的数据库表加以应用,并在此基础上完成相关的算法与程序;2. 给出系统的概要设计、详细设计;3. 完成数据流程图,E-R关系图,数据库表、程序流程图、功能模块图的设计、 对功能编程加以实现;4. 设计必要的视图、触发器、存储过程;5. 使用相关的编程工具(C#.NET)和ORACLE编写代码实现设计的数据库系 统;6. 完成规范化的课程设计报告的编写;7. 每个同学完成一个题目,题目由老师安排。四、实验环境VS2010, SQLsever2008五、课程设计过程1. 根据题目写出关系模型如下: 客户(客户号、客户名、地址、联系方式) 用电类型(类别号、编号、类别名、电价) 员工(员工号、姓名、性别、联系方式) 用电信息(客户号、月份、类别号、用电度数) 费用管理(客户号、月份、费用、收费标志) 收费登记(客户号、月份、应收费用、实收费用、员工号) 结余登记(客户号、月份、应收费用、实收费用、结余费用)2、根据关系模型绘制出E-R模型为:3、创建表1.客户表Create table 客户(客户号 char(5) PRIMARY KEY,客户名char(4),地址 varchar(50),联系方式char (10) );插入数据: Insert Insert Insert Insert Insert Insertinto into into into into into客户 客户 客户 客户 客户 客户values C 00001','张三','市南区','00000005); values (' 00002','李四','黄岛区'0000002'); values (' 00003','王五','崂山区0000003'); values (' 00004','赵兰','城阳区'0000004'); values(J 00005','李青','黄岛区'0000005'); values (' 00006','张倩','市南区','0000001,);2.用电类型表table用电类型Create类别号 类别名 电价 );插入数据: Insert Insert Insert Insert Insertchar (10) PRIMARY KEY, varchar(50),moneyinto into into into into用电类型用电类型用电类型用电类型用电类型values ('ABC','家庭','1.00'); values C ABD','政府','2. 00'); values (' ABE,,'工厂',T. 50'); values ('ABF','学校','2. 50'); values C ABG','医院','0.50');3 .员工表Create table 员工员工号 char (5) PRIMARY KEY, 姓名 char (20), 性别 char (10), 联系方式char (20) ); 插入数据: Insert into Insert into Insert into员工 values (' 12345','李丽','女','1230000'); 员工 values (' 12346','王华',男','1230002'); 员工 values C 12347','张悦',女','1230003,);4.用电信息表Create table用电信息 (客户号 char (5), 类别号 char (10), 月份 date , 用电度数char (8),primary key (客户号,类别号,月份),foreign key (客户号)references 客户(客户号),foreign key (类别号)references用电类型(类别号);'100');'220');'110');'125');'105');'200');'102');'100');Insert into 用电信息 values('00001','ABC','2013T2-01',Insert into 用电信息 values('00001','ABE','2013T2-01',Insert into 用电信息 values('00002','ABC','2013T2-01',Insert into 用电信息 values('00003','ABE','2013T1-01',Insert into 用电信息 values('00003','ABE','2013T2-01',Insert into 用电信息 values('00004','ABC','2013T2-01',Insert into 用电信息 values('00005','ABC','2013T2-01',Insert into 用电信息 values('00006','ABC','2013T2-01',5. 费用管理Create table费用管理(客户号 char(5),月份 date ,费用 money,收费标志 varchar(50),PRIMARY KEY (客户号,月份),foreign key (客户号)references客户(客户号);6. 收费登记Create table收费登记(客户号 char(5),月份 date ,应收费用money,实收费用money,员工号 char(5),PRIMARY KEY (客户号,月份),foreign key (员工号)references 员工(员工号);7. 结余登记Create table结余登记 (客户号 char(5), 月份 date , 应收费用 money, 实收费用 money,结余费用money,PRIMARY KEY (客户号,月份);4. 创建触发器触发器1:计算费用create trigger change_trigger1on用电信息for insertasinsertinto费用管理(客户号,月份,费用)SELECT inserted.客户号 ,inserted .月份 ,inserted.用电度数 *(select 电价 from用电类型,inserted where用电类型.类别号二inserted.类别号) FROM inserted;触发器2:未收标志create trigger change_trigger on 费用管理 for insertasupdate费用管理set收费标志二'未收;触发器3:已收标志create trigger change_trigger3on收费登记for updateasupdate费用管理set收费标志二已收from 费用管理,insertedwhere费用管理.客户号二inserted.客户号and费用管理.月份二inserted.月 份;触发器4:结余登记create trigger change_trigger4on收费登记for updateasinsert into结余登记select inserted.客户号,inserted.月份 ,inserted .应收费用 ,inserted.实收 费用,inserted.实收费用-inserted.应收费用 from inserted;5. 建立存储存储过程1:应收费用,实收费用create procedure ch_procedure01month dateasbeginselect月份,应收费用,实收费用from收费登记where收费登记.月份二monthendgo存储过程2:未收费create procedure ch_procedure02month dateasbeginselect客户号,月份,结余费用from结余登记where结余登记.月份二monthorder by结余费用endgo6. 表间关系关手田“关孚图.位置呈电力食可收我管理系脱"中、-Cloo.l)-±与M弗M承1理2六、代码实现过程1. 显示窗体内的内容及表的内容private void Form5_Load(object sender, EventArgs e)(string consqlserver = "Data Source二GXW-PC;Initial Catalog=liqiuyue0;Integrated Security=True"/string consqlserver = "Data Source二CHEN-PC;Initial Catalog=rl;Integrated Security=True"定义连接数据源string sql = "select * from 用电信息"SqlConnection sqlcon = new SqlConnection(consqlserver);sqlcon.Open();SqlDataAdapter da = new SqlDataAdapter(sql, sqlcon);DataSet ds = new DataSet();/shengming try ( da.Fill(ds);if (ds.Tables0.Rows.Count > 1)/判断是否有符合条件的数据记录(将获得数据源赋予数据库控件 dataGridViewl.DataSource = ds.Tables0;catch (Exception ex)(throw new Exception(ex.ToString();finallysqlcon.Close();sqlcon.Dispose();da.Dispose();结果如图所示:凹用电信息客户号类别号月份用目000012013/9/1LOO0001ABC2013/12/1LOO0001AEE2013/3/34000002ABC2013/10/115000002A£C2013/1Z/11900003ABC2013/8/101200003kBE2013/11/11250003ATE2013/12/11052. 插入一行信息的代码private void label3_Click(object sender, EventArgs e)(private void button1_Click(object sender, EventArgs e)(string consqlserver = "DataSource二GXW-PC;InitialCatalog=liqiuyue0;Integrated Security=True"/ string sql = "select * from 客户"SqlConnection sqlcon = new SqlConnection(consqlserver);sqlcon.Open();try(/首先判断输入信息是否完全if (textBoxl.Text ="") ( MessageBox.Show("请输入完整的数据信息,信息提示 ",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Warning); else ( DataSet ds = new DataSet(); /在此判断保存重复记录问题 string strSqls; strSqls = string.Format("SELECT * FROM 用电信息 where 客 户号='"+ textBox1.Text.Trim() + "'and 类 别 号='"+ textBox2.Text.Trim() + "'and 月份='"+ textBox3.Text.Trim() + "'");定义SQL Server连接对象SqlDataAdapter da = new SqlDataAdapter(strSqls, sqlcon); da.Fill(ds); if (ds.Tables0.Rows.Count > 1) (MessageBox.Show("已经存 在","信 息 提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); else ( strSqls = "insert into 用电信息 values ('" + textBox1.Text.Trim() + "','" + textBox2.Text.Trim() + "','" + textBox3.Text.Trim() + "','" + textBox4.Text.Trim() + "');"定义SQL Server连接对象 / SqlConnection sqlcon1 = new SqlConnection(consqlserver);SqlCommand cmd = new SqlCommand(strSqls, sqlcon1);try ( sqlcon1.Open(); cmd.ExecuteNonQuery(); catch ( finally(sqlcon1.Close();sqlcon1.Dispose();cmd.Dispose();MessageBox.Show(保 存成功",信 息 提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);刷新数据string sqls = "select * from 用电信息"SqlDataAdapter da1 = new SqlDataAdapter(sqls, sqlcon);da1.Fill(ds);if (ds.Tables0.Rows.Count > 1)(dataGridView1.DataSource = ds.Tables0;catch ( 结果如图所示:用电信息客户号类别号月份用畦000012013/9/110000001ABC2013/12/1100k00001AED2013/7/133000001顾2013/3/3400_1OOOOZABCZ013/10/1150OOOOZABCZ013/12/119000003JkEC£013/6/1012000003ABE£013/11/1125+ _卜客户号00001 类别号AID 月份 013/7/1用电度数330增加修改删除3. 修改一行信息的内容private void button2_Click(object sender, EventArgs e)(string consqlserver = "Data Source二GXW-PC;Initial Catalog=liqiuyue0;Integrated Security=True"/ string sql = "select * from 客户"SqlConnection sqlcon = new SqlConnection(consqlserver); sqlcon.Open(); try ( if (textBox1.Text ="") (MessageBox.Show("请输入客户号,类别号,月份","信 息 提 示 ", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning); else ( DataSet ds = new DataSet(); string strSqls = string.Format("SELECT * FROM 用电 信息 where 客户号='"+ textBox1.Text.Trim() + "'and 类别号='"+ textBox2.Text.Trim() + "'and 月份='"+ textBox3.Text.Trim() + "'");/ string strSqls = string.Format("SELECT * FROM客 户 where 客户号='"+ textBox1.Text.Trim() + "'");/ string strSqls = string.Format("update teacher set tname='" + textBox2.Text.Trim() + "'where tno='" + textBox1.Text.Trim() + "'");SqlConnectioncon=newSqlConnection(consqlserver); SqlDataAdapter da = new SqlDataAdapter(strSqls, con);定义SQL Server连接对象 da.Fill(ds);int tnum = dataGridView1CurrentRow,Index;/ 先选 中某一行 string oldDate = dataGridView1Rowstnum.Cells" 月份”.Value.ToString();stringoldLeibie= dataGridView1.Rowstnum.Cells"类别号”.Value.ToString();/ strSqls = string.Format("update 客户 set 客户 名二'"+ textBox2.Text.Trim() + "'where 客户号='"+ textBox1.Text.Trim() + "'update 客户 set 地址=' + textBox3.Text.Trim() + "'where 客户号二' + textBox1.Text.Trim() + "'update 客户 set 联系方式二'"+ textBox4.Text.Trim() + "'where 客户号='"+ textBox1.Text.Trim() + "");strSqls = string.Format("update 用电信息 set 类别 号二'"+ textBox2.Text.Trim() + "',月份二'"+ textBox3.Text.Trim() + "', 用电度数二'"+ textBox4.Text.Trim() + "'where 客户号二'"+ textBox1.Text.Trim() + "'and 类别号='"+ oldLeibie + "'and 月份二'"+ oldDate + "'");SqlConnectioncons=newSqlConnection(consqlserver);SqlCommand cmd = new SqlCommand(strSqls, cons);try(cons.Open();cmd.ExecuteNonQuery();catch ( finally(cons.Close();cons.Dispose();cmd.Dispose();MessageBox.Show("修改成功","信息提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);刷新数据string sqls = "select * from 用电信息";SqlDataAdapter dal = new SqlDataAdapter(sqls, con);DataSet dss = new DataSet();da1.Fill(dss);if (dss.Tables0.Rows.Count > 1)(dataGridView1.DataSource = dss.Tables0;catch ( 运行结果如图所示:(注应该先选中,在修改,目的改主码)5.删除一行信息的内容private void button3_Click(object sender, EventArgs e)(string consqlserver = "Data Source二GXW-PC;Initial Catalog=liqiuyue0;Integrated Security=True"SqlConnection sqlcon = new SqlConnection(consqlserver);sqlcon.Open();try(if (textBox1.Text ="")(MessageBox.Show("请选择或输入要删除的信息,信息 提 示 ",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Warning);else(DataSet ds = new DataSet();/判断要删除的数据信息是否存在string strSqls;strSqls = string.Format("SELECT * FROM 用 电信息 where 客 户号='"+ textBox1.Text.Trim() + "'and 类 别 号='"+ textBox2.Text.Trim() + "'and 月份二' + textBox3.Text.Trim() + "'");/ strSqls = string.Format("SELECT * FROM 客户 where 客户号='"+ textBox1.Text.Trim() + "'");定义SQL Server连接对象SqlConnectioncon=newSqlConnection(consqlserver); SqlDataAdapter da = new SqlDataAdapter(strSqls, con); da.Fill(ds); if (ds.Tables0.Rows.Count > 0) ( if (MessageBox.Show("确认要删除吗?,信息提 示",System.Windows.Forms.MessageBoxButtons.YesNo,System.Windows.Forms.MessageBoxIcon.Question)=System.Windows.Forms.DialogResult.Yes) ( /定义删除数据信息的SQL语句 strSqls = string.Format("delete from 用电 信息 where 客户号='"+ textBox1.Text.Trim() + "'and 类别号='"+ textBox2.Text.Trim() + "'and 月份='"+ textBox3.Text.Trim() + "'"); 定义SQL Server连接对象 SqlConnection cons = new SqlConnection(consqlserver); SqlCommand cmd = new SqlCommand(strSqls, cons); try ( cons.Open(); cmd.ExecuteNonQuery(); catch ( finally ( cons.Close(); cons.Dispose(); cmd.Dispose(); MessageBox.Show("信息删除成功","信息提示 ",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Information); 刷新数据 string sqls = "select * from 用电信息" SqlDataAdapter da1 = new SqlDataAdapter(sqls, con); DataSet dss = new DataSet(); da1.Fill(dss);if (dss.Tables0.Rows.Count > 0)(dataGridViewl.DataSource dss.Tables0;catch ( 七、运行结果展示:触发器实现自动修改和计算:回赛用管理| 口 |回IM月份矗用2013/12/1100. 0000未收2013/8/15.0000未收2013/8/1060.0000未吸2013/7/1100. 0000未吸2013/8/1400. 0000未吸2013/11/110.0000未吸2013/11/12300. 0QQ0未岐米4L=2卜每当添加一个新值,收费标志自动改成未收存储过程的实现,实现存储指定日期的应收费用和实收费用八、总结与心得体会通过几月的课程设计,还是简单地完成了 “某电力公司收费管理信息系统”题目 的相关要求。在设计时创建了表table、存储过程procedure触发器trigger、规 则rule来实现相关的功能和写了、。1语句(create,select等语句)来创建、查询 表中的相关信息,这次课程设计也让我熟悉了使用VS2010和SQLsever2008,同时 把sql语句强加练习了一遍,还学会了创建规则和存储过程还有触发器,并且熟 悉的使用了C#,但也遇到了许多问题,比如:1.由于对C#不熟悉,刚开始插手很 难,后来慢慢熟悉了才掌握了一些编程技巧。2.在修改主码时,由于查询是根据 主码的,所以不好实现,通过查资料,可以把就的值提取出来并保存在一个字符 串里,这样就轻易解决了,代码如:inttnum二dataGridView1.CurrentRow.Index;/先选中某一彳亍string oldDate = dataGridView1.Rowstnum.Cells 月份 .Value.ToString();string oldLeibie = dataGridView1.Rowstnum.Cells"类别号.Value.ToString();这样就可以修改主码了。3.创建触发器来实现相关功能时 由于自身知识的不够,写的不完整,导致不能级联,经过反复修改才能实现。4. 存储过程实现时由于不会调用,不知道怎样传参,做了好长时间,最后经过向别 人请教才实现了存储过程。代码如下:comm.Parameters.Add(month,SqlDbType.Date);comm.Parametersmonth.Value = textBox2.Text;但不管怎么说这次课程设计还是收获不少的,这不仅是对我们一个学期以来所学 知识内容的综合考验,也是我们回顾知识、牢记知识、复习知识的一次大好时机, 同时也是我们从中看到自己的不足的一次作业;我觉得我们应该认真对待、虚心 学习!