
课 程 设 计
| 课程名称 | 数据库系统原理与设计 |
| 题目名称 | 学生信息管理系统 |
| 专业班级 | |
| 学生姓名 | |
| 学 号 | |
| 指导教师 |
摘 要
本文描述的是基于Windows环境的学生信息管理系统,主要功能模块包括:学生信查询,学生信息管理,学生成绩录入,主要工具Microsoft Visual Studio 2008 设计窗体, SQL server2008建立数据库,实现学校信息管理的各个功能。
本篇报告介绍一个学生信息管理系统的从分析到设计最后到开发的全过程为,给出了学生信息管理系统的设计和技术实现的过程,特别在细节上分析功能和函数的实现思想。涉及到学生信息管理的基本功能在本报告中都有相应的描述。
关键词 登录(Formlogin),录入(Formadd),修改(Formmdf),删除(Formdelete) ,查询(Forminquiry)
第一章 绪 论
1.1 设计目的
本课程设计的目的是使学生能熟练掌握简单的简单Windows窗体应用程序的设计,希望通过本次课程设计锻炼学生使用C#语言解决实际问题的能力。
1.2 开发工具选择
本系统后台数据库采用Microsoft SQL Server 数据库,该数据库系统在安全性、准确性和运行速度方面有绝对的优势,并且处理数据量大,效率高;前台采用Microsoft 公司的Visual Studio 2008作为主要开发工具,可与SQL Server 2005数据库无缝链接。
1.3 开发环境
系统开发平台:Microsoft Visual Studio2008
系统开发语言:C#
数据库管理软件:SQL Server 2008
1.4 本报告的主要内容
本报告详细的介绍了学生信息管理系统的开发过程,主要涉及到的工作如下:系统的需求分析、系统的总体设计、系统的概念设计、系统各模块的详细设计、系统运行与测试。
第二章 需求分析
2.1系统需求简介
2.1.1系统目标
(1)根据查询条件实现学生信息的查询
(2)学生选课信息查询
(3)学生信息的增加、删除、修改
(4)对基本信息完成增加、删除、修改时,需注意表与表之间的关联
2.1.2功能需求分析
本系统的功能需求分析如下:
(1)学生信息查询:学生可以根据学号、姓名.
(2)学生信息管理:主要是用于学生信息更新、插入、删除;
2.1.3性能需求分析
(1)登录、用户界面需求:简洁、易懂、易用、友好的用户界面。
(2)安全保密性需求:只有凭借用户名和密码登陆系统,才能进行信息的管理等。
第三章 总体设计
3.1设计概述
根据需求把整个系统分化成不同的模块,每个模块完成一个特定的子功能。把这些模块结合起来组成一个整体。逐一实现各个功能;
3.2系统总体结构及功能模块划分
经过对系统的需求分析,学生信息管理系统主要划分为三个部分:学生信息查询,学生信息管理,学生成绩录入三个功能模块。如图3.2.1 系统的总体结构。
图3.2.1 系统的总体结构
3.2.1学生信息查询模块
学生信息查询:学生可以根据学号、姓名、专业进行查询。如图3.2.2学生信息查询模块结构。
图3.2.2 学生信息管理模块结构
3.2.2学生信息管理模块
学生信息管理:主要是用于学生信息更新、插入、删除,如图3.2.3学生管理模块结构。
学生信息管理
学生信息录入
学生信息删除
学生信息更新
图3.2.3 学生信息管理模块结构
3.3系统数据库概念结构设计
根据对数据项与数据结构的分析,设计出能够满足系统需求的各种实体,及它们之间的关系,为后面的逻辑结构设计打下基础。
3.3.1系统E-R图
系统E-R图可以将各个实体之间的关系显示出来,将各个实体间的属性依赖表示明白。如图3.3.1系统E-R图结构。
图3.3.1系统E-R图结构
3.4安全保密设计
3.4.1用户登录安全性
系统设计了登录界面,每个合法用户有用户名及一个密码,只有当用户输入正确的用户名及密码组合后才能够对学生信息进行操作。
第四章 详细设计
4.1概述
详细设计阶段的根本目标是确定应该怎样具体的实现所要求的系统,也就是说,经过这个阶段的设计工作,应该得出目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。
4.2系统程序流程图
程序流程图又称为程序框图,它是历史悠久使用最广泛的描述软件设计的方法。它可将整个程序的总体流程清楚明白的显示出来。如图4.2.1系统总流程图结构。
图4.2.1系统总体流程图
4.3系统主要功能模块简介
4.3.1系统登录
用户凭借用户名及密码登录,成功登录后可对学生信息进行操作。用户界面如图4.3.1 用户登录界面所示。
图4.3.1 用户登录界面
4.3.2学生信息查询模块
学生信息查询:在程序主界面(如图4.3.2 程序主界面)学生可以根据学号、姓名进行查询。学生也可以只用一种条件进行信息查询,也可以多个条件查询。
图4.3.2 程序主界面
4.3.3学生信息管理模块
学生信息管理:通过右击程序主界面的相应记录弹出的上下文菜单可对当前选定学生信息进行详细信息查询(如图4.3.3 详细信息窗口)、修改信息(如图4.3.4 修改信息窗口)、删除信息(如图 4.3.5 删除信息提示)。更新时如果输入的学号不存在,可选择是否添加学生信息。通过程序主界面的新建信息记录可添加学生信息(如图 4.3.6 添加信息窗口)。
图4.3.3 信息查询
图4.3.4 修改信息窗口
图4.3.5 删除信息提示
图4.3.6 添加信息窗口
第五章 主要功能模块代码
5.1 登录窗口代码设计
private void btnlogin_Click(object sender, EventArgs e)
{ UserInformation user = new UserInformation(txtboxusername.Text.Trim(), txtboxpassword.Text.Trim());
int count = DAL.Dal.getUserInformation(user);
if (count == 1)
{
common.username = txtboxusername.Text;
new Formmain().Show();
this.Hide();
}
else
{
MessageBox.Show("错误的用户名或密码!");
txtboxusername.Text = "";//清空
txtboxpassword.Text = "";
txtboxusername.Focus();//获取焦点
}
}
private void btncancel_Click(object sender, EventArgs e)
{
Application.Exit();
}
5.2 主窗体代码设计
BindingSource bs = new BindingSource();
private void Formmain_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
private void btnfirst_Click(object sender, EventArgs e)
{
bs.MoveFirst();
}
private void btnlast_Click(object sender, EventArgs e)
{
bs.MoveLast();
}
private void btnprevious_Click(object sender, EventArgs e)
{
bs.MovePrevious();
}
private void btnnext_Click(object sender, EventArgs e)
{
bs.MoveNext();
}
private void Formmain_Load(object sender, EventArgs e)
{
mybinding();
}
public void mybinding()//刷新网格
{
bs.DataSource = DAL.Dal.returnTable();
dgv.DataSource = bs;
lbltip.Text = common.username;
}
private void 插入学生信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (new Formadd().ShowDialog() == DialogResult.OK)
{
mybinding();
}
}
private void 删除学生信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (new Formdelete().ShowDialog() == DialogResult.OK)
{
mybinding();
}
}
private void 查询学生信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (new Forminquiry().ShowDialog() == DialogResult.OK)
{
mybinding();
}
}
private void 修改学生信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (new Formmdf().ShowDialog() == DialogResult.OK)
{
mybinding();
}
}
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void 注销ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Hide();
new Formlogin().Show();
}
5.3 录入学生窗体代码设计
private void btninsert_Click(object sender, EventArgs e)
{
if(txtboxsno.Text =="")
{
MessageBox.Show("学号不能为空");
txtboxsno.Focus();
return;
}
if(txtboxsname.Text=="")
{
MessageBox.Show("姓名不能为空");
txtboxsno.Focus();
return;
}
string sno = txtboxsno.Text.Trim();
string sname = txtboxsname.Text.Trim();
string sex = cmbboxsex.Text.Trim();
string day = txtboxsbirthday.Text.Trim();
StudentInformation student = new StudentInformation(sno,sname,sex,day);
DAL.StudentDAO.inserStudent(student);
txtboxsno.Text = "";
txtboxsname.Text = "";
txtboxsbirthday.Text = "";
txtboxsno.Focus();
}
private void Formadd_FormClosed(object sender, FormClosedEventArgs e)
{
this.DialogResult = DialogResult.OK;
}
private void btncancel_Click(object sender, EventArgs e)
{
this.Close();
}
5.4 删除学生窗体代码设计
private void button1_Click(object sender, EventArgs e)
{
if (txtboxsno.Text == "")
{
MessageBox.Show("请输入要删除的学生的学号:");
txtboxsno.Focus();
return;
}
else
{
}
DAL.StudentDAO.deleteStudent(txtboxsno.Text.Trim());
MessageBox.Show("删除完毕");
txtboxsno.Text = "";
txtboxsno.Focus();
}
private void button2_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("请确认是否真的要清空学生数据库", "警告", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
if (dr == DialogResult.OK)
{
DAL.StudentDAO.clear();
}
else
{
//不清空,什么都不做
}
}
private void Formdelete_FormClosed(object sender, FormClosedEventArgs e)
{
this.DialogResult = DialogResult.OK;
}
5.5 修改学生窗体代码设计
private void button1_Click(object sender, EventArgs e)
{
if (txtboxsno.Text == "")
{
MessageBox.Show("请输入要修改的学生的学号:");
txtboxsno.Focus();
return;
}
if (txtboxsname.Text == "")
{
MessageBox.Show("请输入要修改的学生的姓名:");
txtboxsname.Focus();
return;
} if (cmbboxsex.Text == "")
{
MessageBox.Show("请输入要删除的学生的性别:");
cmbboxsex.Focus();
return;
}
if (txtboxsbirthday.Text == "")
{
MessageBox.Show("请输入要删除的学生的生日:");
txtboxsbirthday.Focus();
return;
}
string sno = txtboxsno.Text.Trim();
string sname = txtboxsname.Text.Trim();
string sex = cmbboxsex.Text.Trim();
string sbirthday = txtboxsbirthday.Text.Trim();
StudentInformation student = new StudentInformation(sno, sname, sex, sbirthday);
DAL.StudentDAO.modify(student);
MessageBox.Show("修改成功!", "提示");
txtboxsno.Text = "";
txtboxsname.Text = "";
txtboxsbirthday.Text = "";
txtboxsno.Focus();
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
private void Formmdf_FormClosed(object sender, FormClosedEventArgs e)
{
this.DialogResult = DialogResult.OK;
}
5.6 查询学生窗体代码设计
BindingSource bs = new BindingSource();
private void Forminquiry_Load(object sender, EventArgs e)
{
}
private void btninquiry_Click(object sender, EventArgs e)
{
if (txtboxsno.Text == "")
{
MessageBox.Show("请输入要查找学生的学号:");
txtboxsno.Focus();
return;
}
bs.DataSource = DAL.StudentDAO.returnTable1(txtboxsno.Text.Trim());
dgv.DataSource = bs;
}
private void Forminquiry_FormClosed(object sender, FormClosedEventArgs e)
{
this.DialogResult = DialogResult.OK;
}
private void btncancel_Click(object sender, EventArgs e)
{
this.Close();
}
5.7 数据操作层 代码设计
public class StudentDAO
{
public static void inserStudent(StudentInformation student)
{
string strsql = "insert into student values(@sno,@sname,@sex,@birthday)";
SqlParameter[] para = new SqlParameter[] {
new SqlParameter("@sno",SqlDbType.NVarChar),
new SqlParameter("@sname",SqlDbType.NVarChar),
new SqlParameter("@sex",SqlDbType.NVarChar),
new SqlParameter("@birthday",SqlDbType.NVarChar)
};
int i = 0;
para[i++].Value = student.getSno();
para[i++].Value = student.getSname();
para[i++].Value = student.getSex();
para[i++].Value = student.getBirthday();
Dal.ExecuteNonQuery(strsql, para);
}
public static void deleteStudent(string studentno)
{
string strsql = "delete from student where sno=@no";
SqlParameter[] para = new SqlParameter[]{
new SqlParameter("@no",SqlDbType.NVarChar)
};
para[0].Value = studentno;
Dal.ExecuteNonQuery(strsql, para);
}
public static void clear()
{
string strsql = "delete from student";
SqlParameter[] para = new SqlParameter[] { };
Dal.ExecuteNonQuery(strsql, para);
}
public static DataTable returnTable1(string sno)
{
DataTable table = new DataTable();
string connstr = @"server= .;database=student;integrated security=sspi";
using (SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from student where sno=@sno";
cmd.Parameters.Add(new SqlParameter("sno", @sno));
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(table);
return table;
}
}
}
public static void modify(StudentInformation student)
{
string sql = "update student set sname=@sname where sno=@sno update student set ssex=@sex where sno=@sno update student set sbirthday=@birthday where sno=@sno";
SqlParameter[] para = new SqlParameter[]
{
new SqlParameter ("sno",SqlDbType .NChar),
new SqlParameter ("sname",SqlDbType .NVarChar ),
new SqlParameter ("sex",SqlDbType .NChar ),
new SqlParameter ("birthday",SqlDbType .NChar )
};
int i = 0;
para[i++].Value = student.getSno();
para[i++].Value = student.getSname();
para[i++].Value = student.getSex();
para[i++].Value = student.getBirthday();
Dal.ExecuteNonQuery(sql, para);
}
}
public class Dal
{
public static int getUserInformation(UserInformation user)
{
string connstr = @"server=.;database=student;integrated security=sspi";
using (SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select count(*) from userlogin where username=@name and password=@pwd";
cmd.Parameters.Add(new SqlParameter("@name", user.getUserName()));
cmd.Parameters.Add(new SqlParameter("@pwd", user.getPassword()));
int count = Convert.ToInt32(cmd.ExecuteScalar());//返回第一行第一列的值,不确定的值object
return count;
}
}
}
public static DataTable returnTable()
{
string connstr = @"server=.;database=student;integrated security=sspi";
string sql = "select * from student";
using (SqlConnection conn = new SqlConnection(connstr))//连接数据库的字符串
{
conn.Open();//打开对数据库的连接
using (SqlDataAdapter adapter = new SqlDataAdapter(sql, connstr))
{
//数据的适配器,负责填充数据
DataTable table = new DataTable();
adapter.Fill(table);
return table;
}
}
}
public static void ExecuteNonQuery(string strsql, params SqlParameter[] para)
{
string connstr = @"server=.;database=student;integrated security=sspi";
using (SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = strsql;
cmd.Parameters.AddRange(para);
cmd.ExecuteNonQuery();
}
}
}
}
5.8 MODEL(数据传递)层代码设计
public class StudentInformation
{
private string sno;
private string sname;
private string sex;
private string birthday;
public StudentInformation(string sno,string sname,string sex,string birthday)
{
this.sno = sno;
this.sname = sname;
this.sex = sex;
this.birthday = birthday;
}
public string getSno() { return sno; }
public string getSname() { return sname; }
public string getSex() { return sex; }
public string getBirthday() { return birthday; }
}
public class UserInformation
{
private string username;
private string password;
public UserInformation(string username, string password)
{
this.username = username;
this.password = password;
}
public string getUserName() { return username; }
public string getPassword() { return password; }
第六章 结论
课程设计结束了,在老师和同学的帮助下,我基本完成系统的设计。我按照系统工程软件设计的要求,从需求分析,概念设计,总体设计,详细设计,系统测试等各个步骤,分步完成系统的各项任务,实现了系统中的学生信息查询,学生信息更新,学生信息添加等模块的功能。
通过课程设计我收获如下:
1、巩固和加深了对C#的理解,提高综合运用本课程所学知识的能力。
2、培养了我选用参考书,查阅手册及文献资料的能力。培养思考,深入研究,分析问题、解决问题的能力。
3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
根据我在课程设计中遇到的问题,我将在以后的学习当中注意以下几点:
1、认真上好专业实验课,多在实践中锻炼自己。
2、写程序的过程中要考虑周到,严密。
3、在做设计的时候要有信心,有耐心,切勿浮躁。
4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。
5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。
致谢
这次课程设计主要感谢我们的指导老师。在这个项目刚刚确定下来,我们一头雾水,不知如何开发。因此前期的制作,主要是老师和我们一起开发并且给我们讲解。在老师的引导下,我们逐步完成了整个项目的研发。在这里我们感谢指导老师。
参考文献
[1]《数据库系统原理与设计》 清华大学出版社 万长选、廖国琼、吴京慧、刘洗平
[2] 《C#高级程序设计》 清华大学出版社
