1、项目三 学生管理系统.1 任务一:任务一:“学生管理系统学生管理系统”各窗体设计各窗体设计.2 任务二:任务二:“登录窗体登录窗体”数据库连接操作的功能实现数据库连接操作的功能实现.3 任务三:任务三:“学生管理系统学生管理系统”增删改查操作的实现增删改查操作的实现.1 任务一:任务一:“学生管理系统学生管理系统”各窗体设各窗体设计计.1.1 功能描述功能描述在本项目中,将通过使用工具箱中的文本框、按钮等控件,实现“学生管理系统”的登录界面和学生管理界面。.1.2 设计步骤设计步骤(1)打开Microsoft Visual Studio 2005,单击“创建:项目”,项目类型选择Visual
2、C#,模板选择Windows应用程序,项目名称输入StudentSys,位置根据自己需要选择设定,单击“确定”按钮。(2)单击Form1,在解决资源管理器中将Form1.cs改为LoginForm.cs,在属性窗口修改Text属性为“学生管理系统”,修改StartPosition属性为CenterScreen。(3)在工具箱中拖放两个Label控件、两个TextBox控件和两个按钮控件到LoginForm中,在属性窗口中修改Name和Text属性,如表.1所示,完成的界面如图.1所示。表?.1 登录窗体控件列表 控件名称 代表意义 Name 属性 Text 属性 其它属性 Label 显示用户
3、名 lblUser 用户名:Label 显示密码 lblPassword 密码:TextBox 输入用户名 txtUser TextBox 输入密码 txtPassword PasswordChar属性设为*Button 确定按钮 btnEnter 确定 Button 取消按钮 btnCancel 取消 图.1 登录界面(4)在StudentSys项目中添加一个Windows窗体,命名为StudentForm。在该窗体中添加如表.2所示的控件。用户可根据个人习惯设定窗体背景颜色或者背景图片。控件名称 代表意义 Name 属性 Text 属性 其它属性 GroupBox 容纳简单绑定控件(文本框
4、)gbStudentInfo 学生信息 GroupBox 容纳操作控件 gbOpeartion 操作 GroupBox 容纳添加记录所需的控件 gbAdd 添加记录 TextBox 学生编号绑定 txtStuNo TextBox 学生姓名绑定 txtStuName TextBox 学生生日绑定 txtBirthday TextBox 学生地址绑定 txtAddress 续表 控件名称 代表意义 Name 属性 Text 属性 其它属性 TextBox 学生电话绑定 txtTelephone TextBox 入学时间绑定 txtInTime TextBox 班级编号绑定 txtClass Tex
5、tBox 新增学生编号 tbStuNo TextBox 新增学生姓名 tbStuName TextBox 新增学生生日 tbBirthday TextBox 新增学生地址 tbAddress TextBox 新增学生电话 tbTelphone TextBox 新增入学时间 tbInTime TextBox 新增学生班级编号 tbClass ComboBox 搜索条件 cboSearch Items 属性设置 为 学 号、姓名、出生日期、籍贯、地址、电话号码、入学时间、班级 TextBox 搜索内容 txtSearch 搜索 Button 修改学生信息 btnUpdate 修改 Button 删
6、除学生信息 btnDelete 删除 Button 添加学生信息 btnAdd 添加 DataGridView 显示学生信息 dgView 图.2 学生管理窗体界面 步骤解析:(2)将窗体的StartPosition属性设置为CenterScreen,其目的是使得窗体运行后能显示在屏幕的中间位置。(3)各控件的命名是根据.NET 2005控件命名规范命名的,如表.3所示。表?.3 控 件 的 命 名 控件类型 缩 写 范 例 Label Lbl lblUser TextBox Txt txtUser Button Btn btnEnter (4)使用Panel控件,其目的是为了更好地进行布局,
7、便于控件的统一管理;使用DataGridView是要进行数据的复杂绑定,将数据库中的数据显示出来;而使用TextBox进行数据的简单绑定,是为了定位记录。.2 任务二:任务二:“登录窗体登录窗体”数据库数据库连接操作的功能实现.2.1 功能描述功能描述在“登录窗体”中,通过合法的用户名和密码登录数据库。.2.2 功能步骤及代码解析功能步骤及代码解析(1)在SqlServer 2000中,创建名为“学生管理系统”的数据库,其中包含两张数据表:UserTable和StudentTable。UserTable用于记录合法的用户名和密码,StudentTable用于记录学生记录。具体字段设置如表.4所
8、示。表?.4 UserTable和 StudentTable 数据表 表 名 字 段 名 数据类型 代表意义 UserName Nvarchar 用户名 UserTable Password Nvarchar 密码 StuNo Nvarchar 学号 StuName Nvarchar 姓名 Born Datetime 出生日期 Telphone Nvarchar 电话号码 Address Nvarchar 地址 StudentTable Time Datetime 入学时间 (2)在LoginForm.cs文件中引入命名空间System.Data.SqlClient。(3)在按钮btnEnte
9、r中添加如下代码:1 SqlConnection con=new SqlConnection(“Data Source=.;Initial Catalog=学生管理系统;Integrated Security=True”);2 string sqlStr=string.Format(select count(*)from UserTable where UserName=0 and Password=1,txtUserName.Text,txtPassword.Text);3 SqlCommand com=new SqlCommand(sqlStr,con);4 con.Open();5 in
10、t result=(int)com.ExecuteScalar();6 con.Close();7 if(result=1)8 9 StuForm stuForm=new StuForm();10 stuForm.Show();11 12 else13 14 MessageBox.Show(用户名或者密码错误!请重新输入!);15 代码分析:1 创建一个SqlConnection连接对象con,用于建立与Sql数据库的连接。括号中的参数为字符串类型,代表连接字符串的内容。其中,DataSource代表服务器名;Initial Catalog代表数据库名;Integrated Security代
11、表验证模式。2 创建一个字符串类型的变量,代表用于数据查询的T-SQL语句,其中0和1分别代表用户名和密码的占位符。3 创建一个SqlCommand命令对象com,用于执行对数据库数据的操作。需要设定两个参数值。在此例中,com对象用于查询数据库数据,其中sqlStr代表查询语句,con代表所建立的连接。4 打开数据库连接。5 调用com对象的ExecuteScalar()方法执行查询操作,返回一个对象类型,并将其转换为整型数据,赋值给result。6 关闭数据库连接。7 对result的值进行判断:如果等于1,则代表UserTable表中有符合条件的数据,即存在合法的用户名和密码;如果不等于
12、1,则代表用户名和密码错误。8 如果存在合法的用户名和密码,则实例化StuForm,并调用Show()方法将其显示出来。.2.3 知识库知识库1.SqlConnectionSqlConnection类用于连接SQL数据库。connectionString属性用于设定连接字符串,其中DataSource为数据库名,Initial Catalog为连接数据库名,Integrated Security为验证模式。SqlConnection的Open()方法用于打开数据库连接,Close()方法用于关闭数据库连接。2.SqlCommandSqlCommand类用于执行对数据库数据的增删改查操作。其中,
13、CommandText属性为要执行命令的T-SQL语句或者存储过程的名字;ExecuteNonQuery()方法用于执行增加、删除、修改的操作;ExecuteReader()方法用于执行查询操作,查询返回结果为SqlDataReader类型的对象;ExecuteScalar()方法也用于执行查询操作,其与ExecuteReader()的区别在于返回类型为object类型对象。.3 任务三:任务三:“学生管理系统学生管理系统”增删改查操作的实增删改查操作的实现现.3.1 功能描述功能描述在学生管理窗体中,实现新增记录、删除记录、修改记录以及根据不同的条件查询数据。.3.2 设计步骤及代码解析设计
14、步骤及代码解析(1)在“工具”菜单中,选择“选择工具箱项”。在“.Net Framework组件”选项卡中,选择SqlConnection、SqlDataAdapter。(2)在左侧工具箱中,出现SqlConnection、SqlDataAdapter控件。拖动SqlConnection控件到StuForm中,设置其Name属性为StuCon,并设置其ConnectionString属性。点击右侧的展开按钮,弹出“添加连接”窗体,如图.3所示。图.3 “添加连接”窗体(3)在“添加连接”窗体中,设定所要连接的服务器、数据库以及验证模式。设定服务器名为localhost,数据库名为“学生管理系统
15、”,登录服务器模式为“使用Windows身份验证”。设定完成后,测试连接,如出现成功提示窗体(如图.4所示),则代表连接成功。图.4 测试成功提示窗体(4)拖动SqlDataAdapter控件(数据适配器)到窗体中,会出现“数据适配器配置向导”窗体,如图.5所示。选择所需要的连接,在本例中为“学生管理系统.dbo”,单击“下一步”按钮,出现如图.6所示的窗体,用于生成对数据库数据进行操作的T-SQL语句。单击“查询分析器”按钮,出现如图.7所示的窗体,选择StudentTable(注意,一个数据适配器对应一张数据表),并单击“添加”按钮,出现如图.8所示的窗体,用于选择数据表中所需的数据列。单
16、击“下一步”按钮,进入“向导结果”窗体,如图.9所示。需要注意的是,这里提示数据适配器配置成功,并有5条详细信息,只有当Select、Update、Insert、Delete语句以及表映射生成成功时,才能正确地对数据库数据进行操作。将此控件改名为StuDataAdapter。图.5 数据适配器配置向导选择您的数据连接 图.6 数据适配器配置向导生成SQL语句 图.7 查询生成器添加表 图.8 查询生成器主界面 图.9 数据适配器向导向导结果(5)选定sqlDataAdapter1,单击右键,选择“生成数据集”,出现“生成数据集”窗体,如图.10所示。这里由StuDataAdapter数据适配器
17、生成一个数据集StuDS,数据集用来临时存储数据库内的数据。图.10 “生成数据集”窗体(6)进行复杂数据绑定。设置dgView的DataSource属性为StuDS1,DataMember属性为StudentTable。设置Columns属性,点击右侧的展开按钮,修改每列的HeaderText属性,如StuNo列的HeaderText修改为“学号”,如图.11所示。图.11 “编辑列”窗体(7)在StuForm_Load(object sender,EventArgs e)方法中,写入如下代码,用于将数据库中的内容导入界面的stuDS1数据集:this.StuDataAdapter.Fill
18、(stuDS1);(8)进行简单数据绑定。将“学生信息”组中的文本框控件与数据集内的数据进行绑定,如将txtStuNo的DataBindings中的Text属性设置为stuDS1中的studentTable中StuNo列。(9)在btnAdd按钮单击事件中添加相应代码,实现记录的增加。1 private void btnAdd_Click(object sender,EventArgs e)2 3 try4 5 DataRow dr=stuDS1.TablesstudentTable.NewRow();6 drStuNo=tbStuNo.Text.Trim();7 drStuName=tbSt
19、uName.Text.Trim();8 drBorn=tbBirthday.Text.Trim();9 drClassNo=tbClassNo.Text.Trim();10 drTelphone=tbTelphone.Text.Trim();11 drTime=tbInTime.Text.Trim();12 drAddress=tbAddress.Text.Trim();13 stuDS1.TablesstudentTable.Rows.Add(dr);14 MessageBox.Show(添加成功!);1516 17 catch(Exception ex)18 19 MessageBox.S
20、how(ex.Message);20 21 代码分析:1 添加按钮的单击事件。3 进行异常处理。5 在stuDS1数据集中的studentTable数据表中,创建一个新的空行dr。6 将tbStuNo文本框的内容赋值给数据行dr的“StuNo”列。7 将tbStuName文本框的内容赋值给数据行dr的“StuName”列。8 将tbBirthday文本框的内容赋值给数据行dr的“Born”列。9 将tbClassNo文本框的内容赋值给数据行dr的“ClassNo”列。10 将tbTelphone文本框的内容赋值给数据行dr的“Telphone”列。11 将tbInTime文本框的内容赋值给数据
21、行dr的“Time”列。12 将tbAddress文本框的内容赋值给数据行dr的“Address”列。13 将数据行dr添加到stuDS1数据集中的studentTable数据表中。14 提示“添加成功!”。1719 如果出现异常,则提示异常信息。(10)在btnDelete按钮单击事件中添加相应的代码,实现记录的删除。1 private void btnDelete_Click(object sender,EventArgs e)2 3 try4 DataRow dr=stuDS1.TablesstudentTable.Rowsthis.dgView.CurrentRow.Index;5 d
22、r.Delete();6 MessageBox.Show(删除成功!);7 8 catch(Exception ex)9 10 MessageBox.Show(ex.Message);11 12 代码分析:1 删除按钮的单击事件。4 创建一个DataRow变量dr,将dgView中选中的数据行赋值给dr。5 调用Delete()方法,将dr从数据表中删除。6 提示删除成功。(11)在btnUpdate按钮单击事件中添加相应的代码,实现数据集中记录的更新。1 private void btnUpdate_Click(object sender,EventArgs e)2 3 try4 5 Dat
23、aRow dr=stuDS1.TablesstudentTable.Rowsthis.dgView.CurrentRow.Index;6 dr.BeginEdit();7 drStuNo=txtStuNo.Text.Trim();8 drStuName=txtStuName.Text.Trim();9 drBorn=txtBirthday.Text.Trim();10 drClassNo=txtClassNo.Text.Trim();11 drTelphone=txtTelphone.Text.Trim();12 drTime=txtInTime.Text.Trim();13 drAddres
24、s=txtAddress.Text.Trim();14 dr.EndEdit();15 MessageBox.Show(修改成功!);16 17 catch(Exception ex)18 19 MessageBox.Show(ex.Message);20 21 代码分析:1 修改按钮的单击事件。5 创建一个DataRow变量dr,将dgView中选中的数据行赋值给dr。6 开始编辑数据行。7 将txtStuNo文本框的内容赋值给数据行dr的“StuNo”列。8 将txtStuName文本框的内容赋值给数据行dr的“StuName”列。9 将txtBirthday文本框的内容赋值给数据行dr的
25、“Born”列。10 将txtClassNo文本框的内容赋值给数据行dr的“ClassNo”列。11 将txtTelphone文本框的内容赋值给数据行dr的“Telphone”列。12 将txtInTime文本框的内容赋值给数据行dr的“Time”列。13 将txtAddress文本框的内容赋值给数据行dr的“Address”列。14 结束数据行的编辑。(12)在下拉菜单的选择事件中添加如下代码,以确定查询条件的字段(需先声明一个string类型的变量columnName)。1 switch(cboSearch.SelectedItem.ToString()2 3 case 学号:column
26、Name=StuNo;break;4 case 姓名:columnName=StuName;break;5 case 生日:columnName=Born;break;6 case 班级:columnName=ClassNo;break;7 case 地址:columnName=Address;break;8 case 电话号码:columnName=Telphone;break;9 case 入学时间:columnName=Time;break;10 default:columnName=;break;11 代码分析:1 采用switch结构,以下拉框被选择的项作为表达式。3 如果所选择的项
27、为“学号”,那么将StudentTable表中的“StuNo”字段名赋值给columnName。4 如果所选择的项为“姓名”,那么将StudentTable表中的“StuName”字段名赋值给columnName。5 如果所选择的项为“生日”,那么将StudentTable表中的“Born”字段名赋值给columnName。6 如果所选择的项为“班级”,那么将StudentTable表中的“ClassNo”字段名赋值给columnName。7 如果所选择的项为“地址”,那么将StudentTable表中的“Address”字段名赋值给columnName。8 如果所选择的项为“电话号码”,那么
28、将StudentTable表中的“Telphone”字段名赋值给columnName。9 如果所选择的项为“入学时间”,那么将StudentTable表中的“Time”字段名赋值给columnName。10 其它情况,columnName的值取空值。(13)在查询按钮单击事件中添加如下代码,实现数据的模糊查询。1 private void btnSearch_Click(object sender,EventArgs e)2 3 string sqlStr=string.Format(select*from StudentTable where 0 like%1%,columnName,txt
29、Search.Text.Trim();4 this.StuDataAdapter.SelectCommand.CommandText=sqlStr;5 stuDS1.Clear();6 this.StuDataAdapter.Fill(stuDS1);7 代码分析:1 查询按钮单击事件。3 声明一个字符串类型变量sqlStr,将代表查询语句的T-SQL语句的字符串赋值给sqlStr,其中0,1是占位符。0代表字段名,1代表所要查询的内容。4 将sqlStr赋值给StuDataAdapter数据适配器的查询命令SelectCommand的CommandText属性。5 清空stuDS1数据集。6
30、 重新填充数据集stuDS1。.3.3 知识库知识库1.DataSetDataSet数据集是一个中间存储容器,其主要作用是暂时存储从数据库中读取的数据。一个数据集中可以包含多张数据表。2.SqlDataAdapterSqlDataAdapter类是数据库与数据集的桥梁。SqlDataAdapter类中的Fill()方法用于将数据库的数据读取出来,填充到数据集。SqlDataAdapter类中的Update()方法用于将更改后的DataSet中的数据重新回写入数据库。3.DataGridViewDataGridView类是用于显示数据表信息的控件,其中,DataSource属性为绑定的数据源,需将其设置为某个数据集对象;DataMember属性为绑定的数据表,需将其设置为某个数据表对象;Columns属性为显示的数据表的列的集合。