一、需求分析
(1)还没有注册的客户,可以进入注册界面进行注册。
(2)新建一个报修表,名字为repair_info0,列有用户名、报修类型、报修地点、报修内容,报修日期和时间、用户报修次数。
(3)在报修界面中,当用户点击“报修”按钮时,软件会把用户报修的信息写入数据库中,还可以更新报修次数,同时会清空相应的文本框。
二、具体设计思路
(1)首先建一个报修表,然后在窗体上摆些所需的控件。
(2)我们需要做的有查询、插入、修改。当点击查询的时候,数据会从数据库里读取到相应的控件里,然后我们可以对报修次数进行更改;我们在相应的控件里填写信息,点击报修会把数据插入到数据库里,同时清空了相应的文本框。
(3)我们感觉如果插入日期用填写的方法没有多大意义,还容易出错,于是我们用NumericUpDown控件来获取当日的日期。获取的日期用Label显示,然后插入数据库里,为了不影响界面美观,我们把NumericUpDown控件隐藏起来。
(4)查询、插入、修改都要连接数据库,这样连接数据库的代码要重写多次,所以我们把查询、插入、修改的代码写在一个类里。
三、代码实现
封装代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.Windows.Forms; using System.Data; namespace zhuce { class Class1 { public string strCon = "data source=.;initial catalog=H:\\DATA\\REPAIR.MDF;integrated security=true"; public SqlConnection sqlCon = new SqlConnection(); public SqlDataReader sdr; public DataTable dt = new DataTable(); public SqlDataAdapter sda = new SqlDataAdapter(); public DataSet ds = new DataSet(); public void dbcon() { try { sqlCon = new SqlConnection(strCon); } catch (Exception e) { MessageBox.Show("数据库连接不成功:" + e.ToString()); } } public void dbFill(string selstr) { dt.Clear(); sda = new SqlDataAdapter(selstr, strCon); sda.Fill(ds, "repair_info0"); dt = ds.Tables["repair_info0"]; } public void dbSelect(string showInfo) { sqlCon.Open(); SqlCommand sqlcmd = new SqlCommand(showInfo, sqlCon); sdr = sqlcmd.ExecuteReader(); } public void dbInsert(string insertInfo) { sqlCon.Open(); SqlCommand sqlcmd = new SqlCommand(insertInfo, sqlCon); try { sqlcmd.ExecuteNonQuery(); MessageBox.Show("报修成功!"); } catch (Exception e) { MessageBox.Show("报修失败" + e.ToString()); } sqlCon.Close(); } public void dbInsert1(string insertInfo) { sqlCon.Open(); SqlCommand sqlcmd = new SqlCommand(insertInfo, sqlCon); try { sqlcmd.ExecuteNonQuery(); MessageBox.Show("注册成功!"); } catch (Exception e) { MessageBox.Show("注册失败" + e.ToString()); } sqlCon.Close(); } public void dbUpdate(string updStr) { sqlCon.Open(); SqlCommand sqlcmd = new SqlCommand(updStr, sqlCon); try { sqlcmd.ExecuteNonQuery(); MessageBox.Show("更新成功!"); } catch (Exception e) { MessageBox.Show("更新失败" + e.ToString()); } sqlCon.Close(); } } }
注册代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace zhuce { public partial class Zhuce : Form { public Zhuce() { InitializeComponent(); } Class1 cl = new Class1(); private void zc_Click(object sender, EventArgs e) { cl.dbcon(); string sql = "insert into user_info(userName,passWord) values(‘" + textBox1.Text + "‘,‘" + textBox2.Text + "‘)"; cl.dbInsert1(sql); baoxiu b = new baoxiu(); b.Show(); } } }
报修代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace zhuce { public partial class baoxiu : Form { public baoxiu() { InitializeComponent(); } string selStr = "select * from repair_info0"; Class1 cl = new Class1(); private void bx_Click(object sender, EventArgs e) { year.Value = Convert.ToDecimal(DateTime.Now.Year); month.Value = Convert.ToDecimal(DateTime.Now.Month); day.Value = Convert.ToDecimal(DateTime.Now.Day); cl.dbcon(); string insrtInfo = "insert into repair_info0(userName,bxplace,bxtype,bxcontent,bxdate,bxtime) values(‘" + comboBox2.Text + "‘,‘" + textBox1.Text + "‘,‘" + comboBox1.Text + "‘,‘" + richTextBox1.Text + "‘,‘" + label1.Text + "‘,‘" + textBox3.Text + "‘)"; cl.dbInsert(insrtInfo); textBox1.Text = ""; comboBox2.Text = ""; textBox3.Text = ""; comboBox1.Text = ""; richTextBox1.Text = ""; } private void year_ValueChanged(object sender, EventArgs e) { label1.Text = year.Value + "-" + month.Value + "-" + day.Value; } private void month_ValueChanged(object sender, EventArgs e) { label1.Text = year.Value + "-" + month.Value + "-" + day.Value; } private void day_ValueChanged(object sender, EventArgs e) { label1.Text = year.Value + "-" + month.Value + "-" + day.Value; } private void chaxun_Click(object sender, EventArgs e) { cl.dbcon(); cl.dbFill(selStr); comboBox2.ValueMember = "userName"; comboBox2.DataSource = cl.dt.DefaultView; } private void button1_Click(object sender, EventArgs e) { cl.dbcon(); string strUpd = "update repair_info0 set bxtime=‘" + textBox3.Text + "‘ where userName=‘" + comboBox2.Text + "‘ "; cl.dbUpdate(strUpd); textBox1.Text = ""; comboBox2.Text = ""; textBox3.Text = ""; comboBox1.Text = ""; richTextBox1.Text = ""; } private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { string selStr = "select * from repair_info0 where userName=‘" + comboBox2.Text + "‘"; cl.dbcon(); cl.dbSelect(selStr); if (cl.sdr.Read()) { comboBox2.Text = cl.sdr["userName"].ToString(); textBox1.Text = cl.sdr["bxplace"].ToString(); comboBox1.Text = cl.sdr["bxtype"].ToString(); richTextBox1.Text = cl.sdr["bxcontent"].ToString(); textBox3.Text = cl.sdr["bxtime"].ToString(); label1.Text = cl.sdr["bxdate"].ToString(); } } } }
四、测试
五、PSP耗时分析
PSP2.1 | Personal Software Process Stages | Time(h) |
Planning | 计划 | 10 |
• Estimate | 估计这个任务需要多长时间 | 10 |
Development | 开发 | 7 |
• Analysis | 需求分析 | 1 |
• Design Spec | 生成设计文档 | 1 |
• Coding Standard | 代码规范 | 2 |
• Design | 具体设计 | 1 |
• Coding | 具体代码 | 1 |
• Code Review | 代码复审 | 0.5 |
• Text | 测试 | 0.5 |
Reporting | 报告 | 3 |
• Test Report | 测试报告 | 1 |
• Size Measurement | 计算工作量 |
1 |
• Postmortem | 事后总结 |
1 |
六、团队分工
这次团队作业是我们一个宿舍的七个人,有付媛媛、徐玉莹、王远离、卫文静、梁秋萍、胡田鸽、龚园苑。
具体分工如下:
团队负责人:付媛媛
创建数据库:徐玉莹
连接数据库:王远离
外观设计人员:龚园苑
写代码人员:徐玉莹、付媛媛
测试人员:梁秋萍
写文档人员:胡田鸽
团队人员得分情况如下:
付媛媛:3分
徐玉莹:2分
卫文静:1分
王远离:1分
梁秋萍:1分
胡田鸽:1分
龚园苑:1分
七、总结
这次增量作业比上次难一点,涉及的范围比较广,但我们是打不死的小强,再难也要坚持。当然这种题对我们班的学霸来说是小菜一碟,对我们来说就是学习的过程。其实我们这次完成的还有缺陷。比如更新报修次数,并没有达到我们预想的结果。我们在相应的文本框里填写用户报修信息后,当点击报修的时候,就自动在数据库里bxtime(报修次数)列添加1次报修次数,当我们再读取到这一用户时,再点击报修,就自动更改了数据库里报修次数列为2;而不是我们手动来更改报修次数。不知道老师这次增量的要求是不是表达这个意思。
我们想实现这种结果,但是代码写了又改,总是出错,于是就添加了一个更新按钮来手动更新报修次数。
纸上得来终觉浅,绝知此事要躬行!当我们看到书上写的一些程序时,总觉得实现的功能太过于简单,而且那些都是别人的知识,纸上谈兵终究不行,但当我自己亲自写一些程序时,才发现即使想实现一个很小的功能也是不易的,但只要每一次都能实现小小的功能就算是有了很大的收获。
想要实现一个完美的程序,需要很好的基础功底和思考能力,我们就特别缺少基础知识,希望老师每次布置的作业能让我们巩固基础知识,提高思考能力。