《单元06主从表数据维护.ppt》由会员分享,可在线阅读,更多相关《单元06主从表数据维护.ppt(40页珍藏版)》请在金锄头文库上搜索。
1、单元单元单元单元6 6主从表数据维护与查询主从表数据维护与查询主从表数据维护与查询主从表数据维护与查询回顾回顾 查询学生成绩的查询学生成绩的SQL(学号、姓名、成绩)(学号、姓名、成绩)?在学生表中按班级统计学生人数的在学生表中按班级统计学生人数的SQL?视图有什么作用视图有什么作用?创建视图的语法?创建视图的语法?使用使用PUSH模式制作水晶报表的步骤?模式制作水晶报表的步骤?2本单元任务本单元任务 任务一任务一 完成完成“新增学生新增学生”任务二任务二 完成完成“成绩查询成绩查询”任务三任务三 完成完成“学生选号器学生选号器”新增管理员新增教师新增学生3本单元目标本单元目标创建外键约束创建
2、外键约束向主表、从表录入数据向主表、从表录入数据使用控件查询主从表数据使用控件查询主从表数据使用使用DataView对象对象使用使用DataRelation对象对象4任务一任务一 完成完成“新增学生新增学生 ”模模块块 任务描述:任务描述:任务分析:任务分析:模块功能:实现学生信息的添加功能。模块功能:实现学生信息的添加功能。输入项目:在窗体中录入学生的基本信息,如如学号、姓名、输入项目:在窗体中录入学生的基本信息,如如学号、姓名、地址、电话、等信息,选择所属专业、班级,单击地址、电话、等信息,选择所属专业、班级,单击【保存保存】。输出项目:将录入的学生信息添加到数据表输出项目:将录入的学生信
3、息添加到数据表Student表中。表中。测试要点:测试选择专业后,班级只能选择隶属于选择专业的测试要点:测试选择专业后,班级只能选择隶属于选择专业的班级;是否能正确载入学生数据信息。班级;是否能正确载入学生数据信息。1专业与班级为一对多关系,班级与学生为一对多关系。专业与班级为一对多关系,班级与学生为一对多关系。2学生所在班级的班级号,不能随意输入不存在的班级号。学生所在班级的班级号,不能随意输入不存在的班级号。5外键约束外键约束 陈敏宁陈敏宁05多媒体多媒体15朱婵朱婵05信管信管14曾文权曾文权05软开软开13段班祥段班祥05网络编程网络编程2张艺谋张艺谋明星班明星班1Managercla
4、ssNameclassID100黄蓉黄蓉5108000099StudentNostudentNameclassID5108000089张亮张亮15108000090张利华张利华15108000091李頔飞李頔飞15108000092侯潇楠侯潇楠25108000093杨超杨超2在外键引用中,一个表在外键引用中,一个表的列被引用作为另一个的列被引用作为另一个表的主键值的列表的主键值的列6使用使用Management Studio施加外键约束施加外键约束 【例例6-1】为为MySchool数据库中的数据库中的Class表与表与Student表添加主外键约束。表添加主外键约束。Class表中表中Cla
5、ssId是主键,是主键,Student表中的表中的ClassId是外键是外键 。1. 选择外键表(从表),选择外键表(从表),右击,右击,【修修改改】 2.在表设计器中,右击,单击在表设计器中,右击,单击【关系关系】3.在在“外键关系外键关系”对话框中,单击对话框中,单击【添加添加】4.填写填写“表和列规范表和列规范”。5.单击单击【确定确定】 7使用使用T-SQL施加外键约束施加外键约束 语法:语法:ALTER TABLE 表名表名 ADD CONSTRAINT 约束名约束名 Foreign Key(从表列名从表列名) REFERENCES 主表名(主表列名)主表名(主表列名) 【例例6-2
6、】为为MySchool数据库中的数据库中的Student表和表和Socre表添加外键约束,其中表添加外键约束,其中StudentNo是是Student外的主键,是外的主键,是Score表的外键。表的外键。ALTER TABLE Score ADD CONSTRAINT FK_Score_Student FOREIGN KEY (StudentNo) REFERENCES Student(StudentNo)8主从表数据录入的问题关键主从表数据录入的问题关键 在录入时保证主从表中同一笔数据(例如订单和订单明细)在录入时保证主从表中同一笔数据(例如订单和订单明细)的主表主键和从表外键一致是问题的关
7、键。的主表主键和从表外键一致是问题的关键。一般有两种解决方式:一般有两种解决方式:1.主从表单独设计,分别录入主从表单独设计,分别录入 。2.主从表同一界面设计,同时录入。主从表同一界面设计,同时录入。9使用使用ComboBox 属性属性说明说明DropDownStyle ComboBox的样式的样式Items说明说明组合框中的项组合框中的项 Text文本文本SelectedIndex当前选定项目的索引号当前选定项目的索引号SelectedItem获取当前选定的项获取当前选定的项DataSource绑定的数据源绑定的数据源DisplayMember 显示列显示列ValueMember 值列值列
8、 10ComboBox范例范例使使用用ComboBox来来显显示示的的班班级级信信息息,选选择择班班级级后后,单单击击【确定确定】按钮,显示班级编号。按钮,显示班级编号。11代码分析代码分析 在窗体加载时将班级信息添加到在窗体加载时将班级信息添加到ComboBox控件控件 :开始按钮的开始按钮的Click事件代码事件代码 :private void MainFrm_Load(object sender, EventArgs e) DBHelper db = new DBHelper();/获取班级信息,并绑定到获取班级信息,并绑定到cbxClass组合框组合框cbxClass.DataSour
9、ce = db.getDataSet(SELECT ClassID, ClassName from Class). Tables0; /设置组合框的显示列设置组合框的显示列 cbxClass.DisplayMember = ClassName; /设置组合框的值列设置组合框的值列 cbxClass.ValueMember = ClassID;private void btnStat_Click(object sender, EventArgs e) MessageBox.Show(cbxClass.SelectedValue.ToString(); 12使用使用TabControl 属性属性说
10、明说明MultiLine是否可以显示多行选项卡是否可以显示多行选项卡TabPages说明说明包含的选项卡页的集合包含的选项卡页的集合SelectedIndex当前所选选项卡页的索引值当前所选选项卡页的索引值13任务实施任务实施实现实现“新增学生新增学生”模块模块1设计界面设计界面2. 窗体打开时显示专业信息窗体打开时显示专业信息 3. 选择某专业后,显示该专业的班级信息选择某专业后,显示该专业的班级信息 4. “添加学生添加学生”的保存代码的保存代码教师实现:实现教师实现:实现“修改密码修改密码”学生模仿:实现学生模仿:实现“修改密码修改密码”14代码分析代码分析-显示专业信息显示专业信息 在
11、窗体加载时将班级信息添加到在窗体加载时将班级信息添加到ComboBox控件控件 :private void AddStudentForm_Load(object sender, EventArgs e) string sql = SELECT id, specName FROM Specialty; DBHelper db = new DBHelper(); cboSpe.DataSource = db.getDataSet(sql).Tables0; cboSpe.DisplayMember = specName; cboSpe.ValueMember = id; / 加载完成后,才根据专业
12、显示该专业的班级加载完成后,才根据专业显示该专业的班级 this.cboSpe.SelectedIndexChanged += new System.EventHandler( this.cboGrade_SelectedIndexChanged);15代码分析代码分析-显示专业的班级信息显示专业的班级信息 private void cboGrade_SelectedIndexChanged(object sender, EventArgs e) string speID = cboSpe.SelectedValue.ToString(); string sql = String.Format
13、(SELECT classid, className FROM class where SpecialtyID=0, speID); DBHelper db = new DBHelper(); cboClass.DataSource = db.getDataSet(sql).Tables0; cboClass.DisplayMember = className; cboClass.ValueMember = classid;16代码分析代码分析-保存保存1 private void btnSave_Click(object sender, EventArgs e) if (ValidateIn
14、put() / 获取要插入数据库的每个字段的值获取要插入数据库的每个字段的值 string loginId = txtLoginId.Text; / 用户名用户名 string loginPwd = txtLoginPwd.Text; / 密码密码 / 根据选择的状态设置状态根据选择的状态设置状态id string userStateId = rdoActive.Checked ? (string)rdoActive.Tag : (string) rdoInactive.Tag; string name = txtStudentName.Text; / 姓名姓名 string studentN
15、O = txtStudentNO.Text; / 学号学号 string phone = txtPhone.Text; / 电话电话 string email = txtEmail.Text; / 电邮电邮 string sex = rdoMale.Checked ? 1 : 0;/ 性别性别 / 调用获取班级调用获取班级id的方法,获取班级的方法,获取班级id int classId = Convert.ToInt32(cboClass.SelectedValue); 17代码分析代码分析-保存保存2 / 构建插入的构建插入的sql语句语句 string sql = string.Forma
16、t(INSERT INTO Student(LoginId, LoginPwd, UserStateId, ClassID, StudentName, Sex, Phone, StudentNO, Email) values(0,1, 2,3,4, 5,6,7,8), loginId, loginPwd, userStateId, classId, name, sex, phone, studentNO, email); DBHelper db = new DBHelper(); if(db.updateSql(sql) MessageBox.Show(添加成功!添加成功!, 操作提示操作提示
17、, MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); else MessageBox.Show(添加失败!添加失败!, 操作提示操作提示, MessageBoxButtons.OK, MessageBoxIcon. Warning); 18任务二任务二 完成完成“成绩查询成绩查询 ”模模块块 任务描述:任务描述:任务分析:任务分析:模块功能:实现成绩查询功能。实现按照学号、课模块功能:实现成绩查询功能。实现按照学号、课程、班级组合条件进行查询,程、班级组合条件进行查询,教师可以查看所有教师可以查看所有学生的成绩信息
18、,而学生只能查询本人的成绩信学生的成绩信息,而学生只能查询本人的成绩信息。息。输入项目:用户类别为老师或管理员,则可在窗体输入项目:用户类别为老师或管理员,则可在窗体中选择班级、课程,录入学号;用户类别为学生,中选择班级、课程,录入学号;用户类别为学生,则学号固定为本人学号,且不能修改,可选择课则学号固定为本人学号,且不能修改,可选择课程;单击程;单击【确定确定】按钮。按钮。输出项目:输出项目:DataGridView控件中显示成绩信息。控件中显示成绩信息。测试要点:权限测试,学生只能查询本人成绩;能测试要点:权限测试,学生只能查询本人成绩;能否根据条件查询正确的结果否根据条件查询正确的结果
19、1. 查询条件:班级、查询条件:班级、课程、学号为组合课程、学号为组合查询条件。查询条件。2. 学生只能查询本人学生只能查询本人分数,可使用分数,可使用UserHelper的用户的用户类别、用户号,如类别、用户号,如果登录用户为学生,果登录用户为学生,则将该学生的学号则将该学生的学号设置到查询文本框,设置到查询文本框,并不能修改,就可并不能修改,就可以实现学生只能查以实现学生只能查询本人成绩。询本人成绩。19DataRelation对象对象主要功能:从一个主要功能:从一个DataTable导航导航到另一个到另一个DataTable学生表学生表成绩表成绩表SIDSID主要体现在:主要体现在:1.
20、记录当前记录的子记录或父记录记录当前记录的子记录或父记录2.强制执行约束强制执行约束20创建创建DataRelation创建与添加创建与添加DataRelationDataRelation方法:方法:1. 1. 设计设计器创建器创建2. 2. 代码创建代码创建21DataRelation实现主从表导航显示实现主从表导航显示 【例例6-5】使用使用DataRelation对象实现主从表查询,实对象实现主从表查询,实现学生信息和该学生成绩信息的导航显示。现学生信息和该学生成绩信息的导航显示。教师实现教师实现学生模仿学生模仿22关键步骤关键步骤-创建创建DataRelation创建创建DataRel
21、ation的主要步骤:的主要步骤:在解决方案资在解决方案资源管理器中源管理器中,双双击击 DataSet 1右击,选择右击,选择【添加添加】【Relation】 2设置主表、设置主表、从表、键列从表、键列等关系等关系 323代码分析代码分析-加载学生和成绩数据加载学生和成绩数据 private void Form1_Load(object sender, EventArgs e) SqlDataAdapter da1 = new SqlDataAdapter(select * from student, DBHelper. connection); da1.Fill(dsStudentAndS
22、core1, STUDENT); SqlDataAdapter da2 = new SqlDataAdapter(select * from vw_SCORE, DBHelper. connection); da2.Fill(dsStudentAndScore1, SCORE);加载数据到一个加载数据到一个DataSet中的两个中的两个DataTable。24代码分析代码分析-学生和成绩信息的导航学生和成绩信息的导航/ 在在dataGridView1选择学生,在选择学生,在dataGridView2中显示该学生的成绩中显示该学生的成绩private void dataGridView1_Row
23、Enter(object sender, DataGridViewCellEventArgs e) DsStuAndScore.scoreRow scores; scores= (DsStuAndScore.scoreRow)dsStuAndScore1.Student.Rowse.RowIndex. GetChildRows(FK_Student_score); dataGridView2.DataSource = scores;25DataTableDataTableDataVeiw类似数据库中的视图类似数据库中的视图提供基础提供基础 DataTable 中数据的动态视图中数据的动态视图
24、DataView DataSet26DataView常用属性常用属性属性名称说明Table用于获取或设置源用于获取或设置源DataTableSort 获取或设置获取或设置 DataView 的一个或多个排序的一个或多个排序列以及排序顺序列以及排序顺序 RowFilter 获取或设置用于筛选在获取或设置用于筛选在 DataView 中查看中查看哪些行的表达式哪些行的表达式 Count 在应用在应用RowFilter后,获取后,获取DataView中的中的行数行数27创建创建DataView通过设计器创建通过设计器创建通过代码创建通过代码创建28通过代码创建通过代码创建DataView名称名称 说
25、明说明 DataViewDataView () () 初始化初始化 DataViewDataView 类的新实例。类的新实例。 DataViewDataView ( (DataTableDataTable) ) 用指定的用指定的 DataTableDataTable 初始化初始化 DataViewDataView 类的新类的新实例。实例。 DataViewDataView ( (DataTableDataTable, , String, String, String, String, DataViewRowStateDataViewRowState) ) 用指定的用指定的 DataTableD
26、ataTable、RowFilterRowFilter、SortSort 和和 DataViewRowStateDataViewRowState 初始化初始化 DataViewDataView 类的新实类的新实例。例。 29任务实施任务实施1.编写程序编写程序 2.运行运行“成绩查询成绩查询”模块模块 30代码分析代码分析-加载成绩数据加载成绩数据 ds = db.getDataSet(sql); dataGridView1.AutoGenerateColumns = false; dataGridView1.DataSource = ds.Tables0;DataView dv = ds.T
27、ables0.DefaultView;dv.Sort = 期末成绩期末成绩 desc;加载成绩信息,并按期末成绩逆序排列加载成绩信息,并按期末成绩逆序排列31代码分析代码分析-加载成绩数据加载成绩数据 private void btnOK_Click(object sender, EventArgs e) string classID, subjectID, sWhere; classID = cbxClass.SelectedValue.ToString(); subjectID = cbxSubject.SelectedValue.ToString(); sWhere = String.F
28、ormat(subjectid=0 and classid=1, subjectID, classID); if (txtStudentNo.Text != ) sWhere = sWhere + String.Format( and studentno=0, txtStudentNo.Text); DataView dv = ds.Tables0.DefaultView; dv.RowFilter = sWhere; 查询成绩信息查询成绩信息32任务三任务三 完成完成“学生选号器学生选号器”任务描述:任务描述:任务分析:任务分析:模块功能:实现随机选择某学生功能。教师在课堂模块功能:实现随机
29、选择某学生功能。教师在课堂上点名叫学生回答问题,为了公平起见,需要设上点名叫学生回答问题,为了公平起见,需要设计一个计一个“学生选号器学生选号器”,随机选择某学生。,随机选择某学生。输入项目:在窗体中选择班级,单击输入项目:在窗体中选择班级,单击【开始开始】按钮;按钮;隶属于选择班级的学生学号、姓名便随机跳动显隶属于选择班级的学生学号、姓名便随机跳动显示在窗体上,教师单击示在窗体上,教师单击【停止停止】按钮。按钮。输出项目:随机选择的学生信息(学号、姓名)固输出项目:随机选择的学生信息(学号、姓名)固定不变,为选定学生。定不变,为选定学生。测试要点:是否随机显示学生信息,学生信息是否测试要点:
30、是否随机显示学生信息,学生信息是否隶属于选择班级。隶属于选择班级。 1学生信息跳动显示,学生信息跳动显示,可使用可使用Timer控件。控件。2随机抽取学生信息,随机抽取学生信息,可使用随机函数产可使用随机函数产生随机数。生随机数。3随机数随机数n生成后,生成后,就显示第就显示第n个学生的个学生的信息。信息。33相关知识与技能相关知识与技能1使用使用Timer控件控件Timer 控件是定期引发事件的组件。主要属性、方法和事件:控件是定期引发事件的组件。主要属性、方法和事件:Interval属性:时间间隔的长度,其值以毫秒为单位。若启用了该属性:时间间隔的长度,其值以毫秒为单位。若启用了该组件,则
31、每个时间间隔引发一个组件,则每个时间间隔引发一个 Tick事件。事件。Enable属性:属性:Timer 控件是否生效。控件是否生效。Tick事件:当指定的计时器间隔已过去而且计时器处于启用状态事件:当指定的计时器间隔已过去而且计时器处于启用状态时发生。时发生。 2随机数随机数Random类:随机数生成器,一种能够产生满足某些随机性统计类:随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的类。要求的数字序列的类。Random.Next (整数整数) :返回一个小于所指定最大值的非负随机:返回一个小于所指定最大值的非负随机数。数。 34任务实施任务实施1.编写程序编写程序 2.运行运行
32、“成绩查询成绩查询”模块模块 35代码分析代码分析-加载学生数据加载学生数据 /单击单击【开始开始】按钮时,获取该班级的学生信息按钮时,获取该班级的学生信息 private void btnStart_Click(object sender, EventArgs e) / 得到班级号得到班级号 string classID, sql; classID = cbxClass.SelectedValue.ToString(); sql = string.Format(SELECT 学生序号学生序号,学生姓名学生姓名 FROM 学生学生表表 WHERE 班级序号班级序号=0, classID); D
33、BHelper db = new DBHelper(); dsStudent = db.getDataSet(sql); cnt = dsStudent.Tables0.Rows.Count; timer1.Enabled = true; 36代码分析代码分析 /每秒钟,生成随机数每秒钟,生成随机数n,并显示第,并显示第n个学生的信息个学生的信息 private void timer1_Tick(object sender, EventArgs e) int i; i = rnd.Next(cnt-1); labStuNO.Text = dsStudent.Tables0.Rowsi0.ToS
34、tring(); labStuName.Text = dsStudent.Tables0.Rowsi1.ToString(); private void btnStop_Click(object sender, EventArgs e) timer1.Enabled = false; 37总结总结外键用于建立和加强两个表数据之间连接的一列或多列。外键用于建立和加强两个表数据之间连接的一列或多列。外键的目的是控件可以存储在外键表中的数据。外键的目的是控件可以存储在外键表中的数据。包含主键的表是主表,包含外键的表是从表,主从表在包含主键的表是主表,包含外键的表是从表,主从表在进行数据录入时通常有两
35、种方式,一种是主从表单独设进行数据录入时通常有两种方式,一种是主从表单独设计分别录入;另一种是主从表同一界面设计,同时录入,计分别录入;另一种是主从表同一界面设计,同时录入,录入数据时要先录入主表信息然后再录入从表信息。录入数据时要先录入主表信息然后再录入从表信息。在在VS2005中常使用控件展示查询的数据表信息,常用中常使用控件展示查询的数据表信息,常用的控件有的控件有ComboBox、DataGridView、TabControl等,等,在使用是要了解这些控件的常用属性。在使用是要了解这些控件的常用属性。虽然数据集与数据库中一样包含表和列,但它本身并不虽然数据集与数据库中一样包含表和列,但它本身并不是具有数据库的相关表能力,可以创建是具有数据库的相关表能力,可以创建DataRelation对对象,基于公共键建立主表和从表之间的关系。象,基于公共键建立主表和从表之间的关系。38作业作业39谢谢!谢谢!