单元06主从表数据维护.ppt_第1页
单元06主从表数据维护.ppt_第2页
单元06主从表数据维护.ppt_第3页
单元06主从表数据维护.ppt_第4页
单元06主从表数据维护.ppt_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单元6,主从表数据维护与查询,回顾,查询学生成绩的SQL(学号、姓名、成绩)? 在学生表中按班级统计学生人数的SQL? 视图有什么作用? 创建视图的语法? 使用PUSH模式制作水晶报表的步骤?,本单元任务,任务一 完成“新增学生” 任务二 完成“成绩查询” 任务三 完成“学生选号器”,新增管理员,新增教师,新增学生,本单元目标,创建外键约束 向主表、从表录入数据 使用控件查询主从表数据 使用DataView对象 使用DataRelation对象,任务一 完成“新增学生 ”模块,任务描述:,任务分析:,模块功能:实现学生信息的添加功能。 输入项目:在窗体中录入学生的基本信息,如如学号、姓名、地址、电话、等信息,选择所属专业、班级,单击【保存】。 输出项目:将录入的学生信息添加到数据表Student表中。 测试要点:测试选择专业后,班级只能选择隶属于选择专业的班级;是否能正确载入学生数据信息。,1专业与班级为一对多关系,班级与学生为一对多关系。 2学生所在班级的班级号,不能随意输入不存在的班级号。,外键约束,在外键引用中,一个表的列被引用作为另一个表的主键值的列,使用Management Studio施加外键约束,【例6-1】为MySchool数据库中的Class表与Student表添加主外键约束。Class表中ClassId是主键,Student表中的ClassId是外键 。,1. 选择外键表(从表),右击,【修改】 2.在表设计器中,右击,单击【关系】 3.在“外键关系”对话框中,单击【添加】 4.填写“表和列规范”。 5.单击【确定】,使用T-SQL施加外键约束,语法:,ALTER TABLE 表名 ADD CONSTRAINT 约束名 Foreign Key(从表列名) REFERENCES 主表名(主表列名),【例6-2】为MySchool数据库中的Student表和Socre表添加外键约束,其中StudentNo是Student外的主键,是Score表的外键。,ALTER TABLE Score ADD CONSTRAINT FK_Score_Student FOREIGN KEY (StudentNo) REFERENCES Student(StudentNo),主从表数据录入的问题关键,在录入时保证主从表中同一笔数据(例如订单和订单明细)的主表主键和从表外键一致是问题的关键。 一般有两种解决方式: 1.主从表单独设计,分别录入 。 2.主从表同一界面设计,同时录入。,使用ComboBox,ComboBox范例,使用ComboBox来显示的班级信息,选择班级后,单击【确定】按钮,显示班级编号。,代码分析,在窗体加载时将班级信息添加到ComboBox控件 : 开始按钮的Click事件代码 :,private void MainFrm_Load(object sender, EventArgs e) DBHelper db = new DBHelper(); /获取班级信息,并绑定到cbxClass组合框 cbxClass.DataSource = 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(); ,使用TabControl,任务实施,实现“新增学生”模块 1设计界面 2. 窗体打开时显示专业信息 3. 选择某专业后,显示该专业的班级信息 4. “添加学生”的保存代码,教师实现:实现“修改密码”,学生模仿:实现“修改密码”,代码分析-显示专业信息,在窗体加载时将班级信息添加到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“; / 加载完成后,才根据专业显示该专业的班级 this.cboSpe.SelectedIndexChanged += new System.EventHandler( this.cboGrade_ SelectedIndexChanged); ,代码分析-显示专业的班级信息,private void cboGrade_SelectedIndexChanged(object sender, EventArgs e) string speID = cboSpe.SelectedValue.ToString(); string sql = String.Format(“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“; ,代码分析-保存1,private void btnSave_Click(object sender, EventArgs e) if (ValidateInput() / 获取要插入数据库的每个字段的值 string loginId = txtLoginId.Text; / 用户名 string loginPwd = txtLoginPwd.Text; / 密码 / 根据选择的状态设置状态id string userStateId = rdoActive.Checked ? (string)rdoActive.Tag : (string) rdoInactive.Tag; string name = txtStudentName.Text; / 姓名 string studentNO = txtStudentNO.Text; / 学号 string phone = txtPhone.Text; / 电话 string email = txtEmail.Text; / 电邮 string sex = rdoMale.Checked ? “1“ : “0“; / 性别 / 调用获取班级id的方法,获取班级id int classId = Convert.ToInt32(cboClass.SelectedValue);,代码分析-保存2,/ 构建插入的sql语句 string sql = string.Format(“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(“添加成功!“, “操作提示“, MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); else MessageBox.Show(“添加失败!“, “操作提示“, MessageBoxButtons.OK, MessageBoxIcon. Warning); ,任务二 完成“成绩查询 ”模块,任务描述:,任务分析:,模块功能:实现成绩查询功能。实现按照学号、课程、班级组合条件进行查询,教师可以查看所有学生的成绩信息,而学生只能查询本人的成绩信息。 输入项目:用户类别为老师或管理员,则可在窗体中选择班级、课程,录入学号;用户类别为学生,则学号固定为本人学号,且不能修改,可选择课程;单击【确定】按钮。 输出项目:DataGridView控件中显示成绩信息。 测试要点:权限测试,学生只能查询本人成绩;能否根据条件查询正确的结果,1. 查询条件:班级、课程、学号为组合查询条件。 2. 学生只能查询本人分数,可使用UserHelper的用户类别、用户号,如果登录用户为学生,则将该学生的学号设置到查询文本框,并不能修改,就可以实现学生只能查询本人成绩。,DataRelation对象,主要功能:从一个DataTable导航到另一个DataTable,学生表,成绩表,SID,SID,主要体现在: 记录当前记录的子记录或父记录 强制执行约束,创建DataRelation,创建与添加DataRelation方法: 1. 设计器创建 2. 代码创建,DataRelation实现主从表导航显示,【例6-5】使用DataRelation对象实现主从表查询,实现学生信息和该学生成绩信息的导航显示。,教师实现,学生模仿,关键步骤-创建DataRelation,创建DataRelation的主要步骤:,代码分析-加载学生和成绩数据,private void Form1_Load(object sender, EventArgs e) SqlDataAdapter da1 = new SqlDataAdapter( “select * from student“, DBHelper. connection); da1.Fill(dsStudentAndScore1, “STUDENT“); SqlDataAdapter da2 = new SqlDataAdapter( “select * from vw_SCORE“, DBHelper. connection); da2.Fill(dsStudentAndScore1, “SCORE“); ,加载数据到一个DataSet中的两个DataTable。,代码分析-学生和成绩信息的导航,/ 在dataGridView1选择学生,在dataGridView2中显示该学生的成绩 private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e) DsStuAndScore.scoreRow scores; scores= (DsStuAndScore.scoreRow)dsStuAndScore1.Student.Rowse.RowIndex. GetChildRows(“FK_Student_score“); dataGridView2.DataSource = scores; ,DataTable,DataTable,DataVeiw,类似数据库中的视图 提供基础 DataTable 中数据的动态视图,DataView,DataSet,DataView,常用属性,创建DataView,通过设计器创建 通过代码创建,通过代码创建DataView,任务实施,1.编写程序 2.运行“成绩查询”模块,代码分析-加载成绩数据, ds = db.getDataSet(sql); dataGridView1.AutoGenerateColumns = false; dataGridView1.DataSource = ds.Tables0; DataView dv = ds.Tables0.DefaultView; dv.Sort = “期末成绩 desc“; ,加载成绩信息,并按期末成绩逆序排列,代码分析-加载成绩数据,private void btnOK_Click(object sender, EventArgs e) string classID, subjectID, sWhere; classID = cbxClass.SelectedValue.ToString(); subjectID = cbxSubject.SelectedValue.ToString(); sWhere = String.Format(“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; ,查询成绩信息,任务三 完成“学生选号器”,任务描述:,任务分析:,模块功能:实现随机选择某学生功能。教师在课堂上点名叫学生回答问题,为了公平起见,需要设计一个“学生选号器”,随机选择某学生。 输入项目:在窗体中选择班级,单击【开始】按钮;隶属于选择班级的学生学号、姓名便随机跳动显示在窗体上,教师单击【停止】按钮。 输出项目:随机选择的学生信息(学号、姓名)固定不变,为选定学生。 测试要点:是否随机显示学生信息,学生信息是否隶属于选择班级。,1学生信息跳动显示,可使用Timer控件。 2随机抽取学生信息,可使用随机函数产生随机数。 3随机数n生成后,就显示第n个学生的信息。,相关知识与技能,1使用Timer控件 Timer 控件是定期引发事件的组件。主要属性、方法和事件: Interval属性:时间间隔的长度,其值以毫秒为单位。若启用了该组件,则每个时间间隔引发一个 Tick事件。 Enable属性:Timer 控件是否生效。 Tick事件:当指定的计时器间隔已过去而且计时器处于启用状态时发生。 2随机数 Random类:随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的类。 Random.Next (整数) :返回一个小于所指定最大值的非负随机数。,任务实施,1.编写程序 2.运行“成绩查询”模块,代码分析-加载学生数据,/单击【开始】按钮时,获取该班级的学生信息 private void btnStart_Click(object sender, EventArgs e) / 得到班级号 string classID, sql; classID = cbxClass.SelectedValue.ToString(); sql = string.Format(“SELECT 学生序号,学生姓名 FROM 学生表 WHERE 班级序号=0“, classID); DBHelper db = new

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论