数据库系统开发实验三
数据库系统实验课实验报告

数据库系统实验课实验报告一、实验目的数据库系统实验课是一门重要的实践课程,旨在通过实际操作和实验,深入理解数据库系统的原理和应用,提高我们的数据库设计、管理和应用开发能力。
本次实验的具体目的包括:1、熟悉数据库管理系统(DBMS)的操作环境和基本命令。
2、掌握数据库的创建、表的设计、数据的插入、查询、更新和删除等基本操作。
3、学会使用 SQL 语句进行复杂的数据查询和数据处理。
4、理解数据库的完整性约束、索引和存储过程的概念及应用。
5、培养解决实际数据库问题的能力和团队协作精神。
二、实验环境本次实验使用的数据库管理系统是 MySQL 80,实验在 Windows 10 操作系统上进行。
使用的开发工具包括 MySQL Workbench 和命令行终端。
三、实验内容1、数据库的创建使用 CREATE DATABASE 语句创建了一个名为“student_management”的数据库,用于存储学生管理相关的数据。
2、表的设计在“student_management”数据库中,设计了以下几张表:“students”表,包含学生的学号(student_id)、姓名(student_name)、性别(gender)、年龄(age)等字段。
“courses”表,包含课程的课程号(course_id)、课程名称(course_name)、学分(credit)等字段。
“enrolls”表,用于记录学生选课的信息,包含学号(student_id)、课程号(course_id)、成绩(grade)等字段。
在设计表时,为每个字段选择了合适的数据类型,并设置了主键和外键约束,以保证数据的完整性和一致性。
3、数据的插入使用 INSERT INTO 语句向“students”、“courses”和“enrolls”表中插入了一些示例数据,以便进行后续的查询和操作。
4、数据的查询使用简单的 SELECT 语句查询了“students”表中的所有学生信息。
数据库系统实验报告

数据库系统实验报告篇一:数据库系统实验报告实验一SQL语言一、实验目的(1)通过上机实践,熟悉Oracle的SQL * Plus环境及使用方法(2)掌握SQL语言,能熟练运用SQL语言进行数据定义和数据操纵(3)加深对关系数据模型的数据结构和约束的理解二、实验环境硬件:微机软件:ORACLE 8i或9i三、实验内容及要求1.了解并掌握SQL * Plus环境的使用2.用SQL的DDL语句图书管理系统创建基表3.为基表“读者”补充定义:职称只能取初级、中级、高级之一4.用SQL的DML语句向上述基表中增加、修改和删除数据5.用SQL的QL语句完成指定查询6.用SQL的DDL语句创建视图、索引7.为自己创建一张结构与scott用户的员工表emp相同的员工表。
四、实验过程1、用SQL的DDL语句图书管理系统创建基表图书(图书编号、分类号、书名、作者、出版单位、单价) CREATE TABLE 图书(图书编号VARCHAR(4) PRIMARY KEY,分类号VARCHAR(5),书名VARCHAR(18),作者VARCHAR(8),出版单位VARCHAR(10),单价DEC(5,2));读者(借书证号、姓名、单位、职称)CREATE TABLE 读者(借书证号VARCHAR(6) PRIMARY KEY,姓名VARCHAR(10),单位VARCHAR(10),职称VARCHAR(10));借阅(借书证号、图书编号、借阅日期、备注)CREATE TABLE 借阅(借书证号VARCHAR(6),图书编号VARCHAR(4), 借阅日期DATE,备注VARCHAR(30),PRIMARY KEY(借书证号,图书编号),FOREIGN KEY(借书证号)REFERENCES 读者(借书证号),FOREIGN KEY(图书编号) REFERENCES 图书(图书编号));2、为基表“读者”补充定义:职称只能取初级、中级、高级之一ALTER TABLE 读者ADD CHECK(职称IN(‘初级’,’中级’,’高级’));3、向三个基表中插入指定数据。
数据库系统开发仿真实训计划

数据库系统开发仿真实训计划一、实训背景随着信息技术的不断发展,数据库系统在企业管理、数据分析、电子商务等领域的应用越来越广泛。
为了让学生更好地掌握数据库系统开发的理论知识和实践技能,提高学生的综合应用能力和解决实际问题的能力,特制定本数据库系统开发仿真实训计划。
二、实训目标1、使学生深入理解数据库系统的基本概念、原理和技术,包括数据模型、关系数据库、SQL 语言、数据库设计、数据库管理等。
2、培养学生运用数据库系统开发工具和技术进行数据库设计、开发和管理的实践能力。
3、提高学生的团队协作能力、沟通能力和创新能力,培养学生的工程意识和职业素养。
三、实训内容1、数据库系统基础知识讲解数据模型(层次模型、网状模型、关系模型等)关系数据库理论(函数依赖、范式等)SQL 语言基础(数据定义、数据查询、数据更新等)2、数据库设计需求分析概念结构设计(ER 图)逻辑结构设计(将 ER 图转换为关系模式)物理结构设计(索引、存储过程等)3、数据库开发工具的使用熟练掌握一种主流的数据库管理系统(如 MySQL、Oracle、SQL Server 等)学会使用数据库开发工具(如 Navicat、PL/SQL Developer 等)进行数据库的创建、管理和操作4、数据库应用系统开发基于数据库开发一个简单的应用系统,如学生管理系统、图书管理系统等实现系统的登录、注册、数据录入、查询、修改、删除等功能5、数据库性能优化与管理学习数据库性能优化的基本方法,如索引优化、查询优化等掌握数据库的备份与恢复、安全管理等知识四、实训安排1、第一阶段:理论知识学习(2 天)讲解数据库系统的基本概念、原理和技术,通过案例分析加深学生对理论知识的理解。
布置相关的课后作业,让学生巩固所学知识。
2、第二阶段:数据库设计(3 天)分组进行项目选题,确定数据库应用系统的开发需求。
进行需求分析,绘制 ER 图,完成概念结构设计。
将 ER 图转换为关系模式,进行逻辑结构设计,并进行物理结构设计。
数据库系统实验报告

数据库系统实验报告一、实验目的本次数据库系统实验旨在通过实际操作,巩固和加深对数据库系统基本原理和操作的理解,提高数据库设计和管理的能力。
二、实验环境本次实验使用的数据库系统为MySQL,操作系统为Windows 10。
实验中使用了SQL语句来进行数据库的创建、数据的插入、查询和更新等操作。
三、实验内容1. 数据库的创建:首先在MySQL中创建一个名为"mydb"的数据库。
2. 创建表格:在"mydb"数据库中创建一个名为"students"的表格,包括字段有学号、姓名、性别和年龄。
3. 插入数据:向"students"表格中插入几条学生信息的数据。
4. 查询操作:利用SQL语句查询"students"表格中的数据,比如查询所有学生信息、查询特定学生的信息等。
5. 更新操作:使用UPDATE语句对"students"表格中的数据进行更新,比如修改学生的年龄等。
四、实验步骤1. 打开MySQL数据库并连接至"mydb"数据库。
2. 创建名为"students"的表格,设定字段为学号、姓名、性别和年龄。
3. 插入几条学生信息的数据如下:学号姓名性别年龄001 张三男 20002 李四女 214. 运行SQL语句查询"students"表格中所有学生信息。
5. 运行UPDATE语句,将学号为001的学生年龄修改为22岁。
五、实验结果通过实验操作,成功创建了数据库和表格,并成功插入了学生信息的数据。
查询操作和更新操作也均成功,数据库系统运行良好。
六、实验总结本次数据库系统实验对于巩固数据库基础知识和操作技能有很大帮助。
通过实践操作,加深了对SQL语句和数据库管理的理解,提高了数据处理和操作的能力。
希望在以后的学习和工作中能够更熟练地运用数据库系统进行数据管理和处理。
数据库实验三SQL语言的DDL

数据库实验三SQL语⾔的DDL《数据库系统概论》实验报告实验三:SQL语⾔的DDL 姓名⽇期实验内容与完成情况:⼀、实验内容:1、启动数据库服务软件SQL Server 2008的查询分析器,⽤如下语句对表进⾏操作,详细的语法格式参看课本相应章节:Create Table 建表Drop Table 删除表Alter Table 更改表如下语句对索引进⾏操作,详细的语法格式参看课本相应章节:Create Index 建⽴索引Drop Index 删除索引⼆、实验任务1.打开数据库SQL Server 2008的查询分析器,⽤Create Table建表Student,course,sc。
数据库的名称为“学⽣选课”,各个表结构如教材P79页所⽰。
以下要求⽤T-SQL来实现:2.向表中填⼊教材P79数据。
3.向Student 表增加“⼊学时间”列(列名为Scome,⽇期型)4.将年龄的数据类型改为整型。
5.为Student中sname添加列级完整性约束,不能为空。
为Student中sno添加列级完整性约束,取值唯⼀,不能为空。
6.删除Student中sname列级完整性约束。
7.为SC建⽴按学号升序和课程号降序建⽴唯⼀索引。
8.建⽴Student、Course及SC的主码约束在之前创建各表是已经建⽴主码约束9.建⽴ Student与SC、Course与SC之间的外码约束在之前创建各表是已经建⽴外码约束10.实现学⽣性别只能是“男”或“⼥”的Check(检查)约束。
11.实现学⽣年龄只能⼩于等于30⼤于17的语义约束12.⽤Create Index对表student的sname字段建⽴⼀个升序索引,索引名Indexs。
13.⽤Drop Index删除索引Indexs。
14.SC表的成绩值应该在0到100之间。
15.修改表Student中的约束条件,要求学号在900000~999999之间,年龄⼩于40。
实验三 数据库中的数据查询及视图操作实验报告

实验三数据库中的数据查询及视图操作实验报告实验三数据库中的数据查询及视图操作实验报告一、实验目的本实验的主要目的是熟悉数据库中的数据查询和视图操作。
通过本实验,我们可以掌握使用SQL语句进行数据查询和创建视图的方法,进一步提高对数据库的操作能力。
二、实验环境本实验使用MySQL数据库管理系统,并在Windows操作系统下进行实验。
三、实验内容本实验主要包括以下内容:1. 数据查询:使用SELECT语句查询数据库中的数据,并进行排序、过滤和聚合操作。
2. 视图操作:创建和删除视图,以及对视图进行查询和更新操作。
四、实验步骤与结果1. 数据查询首先,我们需要连接到数据库,并选择要查询的表。
假设我们选择的表名为"students",包含以下字段:学号、姓名、性别、年龄、班级。
a. 查询所有学生的信息:```sqlSELECT * FROM students;```执行以上SQL语句后,我们可以得到所有学生的信息,包括学号、姓名、性别、年龄和班级。
b. 查询男生的信息:```sqlSELECT * FROM students WHERE 性别 = '男';```执行以上SQL语句后,我们可以得到所有性别为男的学生的信息。
c. 查询年龄小于20岁的学生的姓名和班级:```sqlSELECT 姓名, 班级 FROM students WHERE 年龄 < 20;```执行以上SQL语句后,我们可以得到年龄小于20岁的学生的姓名和班级。
d. 查询学生按照年龄降序排列的结果:```sqlSELECT * FROM students ORDER BY 年龄 DESC;```执行以上SQL语句后,我们可以得到按照年龄降序排列的学生信息。
e. 查询学生按照班级分组,并统计每个班级的人数:```sqlSELECT 班级, COUNT(*) AS 人数 FROM students GROUP BY 班级;```执行以上SQL语句后,我们可以得到每个班级的人数统计结果。
数据库实验3报告

实验三数据更新、视图、权限管理实验3.1 数据更新1 实验内容(1) 使用INSERT INTO语句插入数据,包括插入一个元组或将子查询的结果插入到数据库中两种方式。
(2) 使用SELECT INTO语句,产生一个新表并插入数据。
(3) 使用UPDATE语句可以修改制定表中满足WHERE子句条件的元组,有三种修改的方式:修改某个元组的值;修改多个元组的值;带子查询的修改语句。
(4) 使用DELETE语句删除数据:删除某一个元组的值;删除多个元组的值;带子查询的删除语句。
2 实验步骤在数据库School上按下列要求进行数据更新可在SQL代码前加下面两句SQL语句,用于确保当前使用的是School数据库Use Schoolgo(1)使用SQL语句向STUDENTS表中插入元组(编号:12345678 名字:LiMing EMAIL:LM@年级:2002)。
Insert into STUDENTS values('12345678','LiMing','LM@','2002')(2)对每个课程,求学生的选课人数和学生的最高成绩,并把结果存入数据库。
使用SELECTINTO和INSERT INTO两种方法实现。
Insert into:create table Courses_maxScore(cid char(20),Count_courses int,maxScore int)insert into Courses_maxScore (cid,Count_courses,maxScore)select cid,count(*)as Count_courses,max(score)as maxScore from CHOICES group by cidselect*from Courses_maxScoreSelect into:select cid,Count_courses,maxScore into cnCourses_maxScore from Courses_maxScoreselect*from cnCourses_maxScore(3)在STUDENTS表中使用SQL语句将姓名为LiMing.的学生的EMAIL改为LM@。
数据库实验报告3

数据库实验报告课程:数据库原理及应用正文:一、实验目的1.理解索引和视图的概念。
2.掌握索引的使用方法。
3.掌握视图的定义和使用方法。
4.理解存储过程的概念,掌握存储过程的使用方法。
5.学习触发器的使用,体会触发器执行的时机,加深对触发器功能和作用的理解。
6.理解SQL Server2000验证用户身份的过程,掌握设置身份验证模式的方法。
7.理解登陆账号的概念,掌握混合认证模式下登陆账号的建立与取消方法。
8.掌握混合认证模式下数据库用户的建立与取消。
9.掌握数据库用户权限的设置方法。
10.理解角色的概念,掌握管理角色技术。
11.学会配制ODBC数据源。
了解使用ODBC来进行数据库应用程序设计,通过ODBC接口访问数据库并对数据库进行操作。
学习在Visual Basic中使用ADO控件访问后台的SQL Server数据库。
二、实验内容1.建立索引。
对JWGL数据库的学生选课表SC建立索引,要求按照Cno升序、Grade降序建立一个名为SC_ind的索引。
USE JWGLIF EXISTS(SELECT name FROM sysindexes WHERE name = 'SC_ind')DROP INDEX SC.SC_ind;GOUSE JWGLCREATE INDEX SC_ind ON SC (Cno,Grade DESC);2.视图的定义和操作,(1)在JWGL数据库里,完成第三章例3.54~例3.61例题中视图的定义和视图上的查询、更新操作。
(2)在Market数据库中,完成第三章习题11中(1)中建立视图的操作,然后在视图上完成第三章习题11(2)的查询操作。
3.在数据库JWGL中,完成第四章例1,例3~7中例题的创建存储过程的操作,并使用EXEC语句调用这些存储过程执行,观察他们的执行结果。
4.在Market数据库中,完成第四章习题5中(1)~(4)创建存储过程的操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告姓名:学号:班级:实验:订单管理时间: 2017年9月28日目录一、实验目的(通过实验要达到什么样的效果,学到什么东西)二、实验条件(实验使用软件)三、实验内容(实验需要做的具体详细的实验项目)四、实验要求(实验中,我们要注意的实验事项和写实验报告的详细要求)五、实验步骤(实验步骤包括具体的每个实验的实验方法、实验结果和实验结果分析,按照每步遇到的问题,进行分析解决)六、实验感悟(总结实验中遇到的问题,以后该怎么解决)学习数据库应用程序的开发和实现部分功能(查询、插入、删除、更新和保存等)二、实验条件Microsoft SQL Server Management StudioMicrosoft Visual StudioWindows 8C#编程语言三、实验内容编程实现示例数据库中订单明细SalesOrderDetail的查询、插入、更新与删除功能如下:(1)查询功能。
程序运行后,订单表中显示所有订单,第一个订单为当前订单,订单明细表中显示当前订单的所有订单明细。
当前订单发生改变时(即点击订单表中的某个订单埋),订单明细表中的内容发生相应的变化。
(2)删除功能:选取订单明细中的一行,点击删除,选择的订单明细从表中删除,但并不真正从数据库中删除。
(3)插入功能:可以在订单明细表的最后输入新的订单明细。
(4)更新功能:可以修改订单明细表中的某一行的内容。
如果输入的单价(UnitPrice)大于产品的公开报价,则提示相应的信息(利用4.6.2的触发器完成此功能)。
(5)保存功能:点击保存按钮时,将订单明细保存到数据库。
(6)关闭功能:点击关闭按钮时,如果订单明细有修改但没有保存,则提示是否关闭,如果不关闭则返回,否则关闭程序,如果没有修改,则直接关闭。
四、实验要求1.订单查询实验要求使用并任选一种程序设计语言进行编程。
实验报告需要说明所采用的方法、结果和总结(结果分析)。
实验方法部分说明采用的开发环境,包括操作系统、数据库管理系统及其版本、编程工具及其版本、和编程语言。
如果使用则在实验方法部分回答下面的问题:(1)使用哪种数据提供程序?(2)使用的数据连接对象是哪一个?连接对象是如何建立的?最后生成的连接对象中的连接字符串是什么?代表什么含义?(3)使用的数据适配器对象是什么?其中的查询或更新语句是什么?如果有参数则参数是如何处理的?(4)使用的数据集对象是什么?数据集中有哪些数据表?数据表是由哪些适配器对象生成的?(或采用其它方法)。
实验方法中还需要给出手工添加的代码及对代码的说明。
实验结果部分给出程序运行的界面和操作的简单说明。
总结部分对实验过程中出现的总是进行分析,同时提出所开发的程序还有哪些可以改进的地方。
实验方法:回答实验要求中的实验问题(1)使用哪种数据提供程序?答:OLEDB类数据。
(2)使用的数据连接对象是哪一个?连接对象是如何建立的?最后生成的连接对象中的连接字符串是什么?代表什么含义?答:连接对象oleDbConnection1数据适配器:oleDbDataAdapter1和oleDbDataAdapter2oleDbDataAdapter1Provider=SQLNCLI11(客户端组件,代表一个驱动)Data Source=LENOVO-PC(代表数据源是LENOVO-PC)Security=SSPI(代表以window用户登录服务器)Initial Catlog=AdventureWorks(代表连接数据库为AdventureWorks) oleDbDataAdapter2Provider=SQLNCLI11(客户端组件,代表一个驱动)Data Source=LENOVO-PC(代表数据源是LENOVO-PC)Security=SSPI(代表以window用户登录服务器)Initial Catlog=AdventureWorks(代表连接数据库为AdventureWorks)(3)使用的数据适配器对象是什么?其中的查询或更新语句是什么?如果有参数则参数是如何处理的?答:oleDbDataAdapter1:1)查询语句:SELECT SalesOrderID, OrderDate, DueDate, ShipDate, Status, SalesOrderNumberFROM Sales.SalesOrderHeader2)没有参数OleDbDataAdapter2:1)查询语句:SELECT SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber, OrderQty, ProductID, SpecialOfferID, UnitPrice,UnitPriceDiscount, LineTotal, rowguid, ModifiedDateFROM Sales.SalesOrderDetail2)没有参数(4)使用的数据集对象是什么?数据集中有哪些数据表?数据表是由哪些适配器对象生成的?(或采用其它方法)。
答:dataSet11->SalesOrderHeader表->oleDbDataAdapter1dataSet21->SalesOrderDetail表->oleDbDataAdapter21.基本框架设计介绍1.1新建一个项目客户管理4.0,选择的参数如下1.2打开新建的项目客户管理4.01.3窗口进行如下图所示的设计订单:使用dataGridView创建,名字设置为dataGridView1Datasource:dataSet11Datamember:SalesOrderHeader订单明细:使用datagridview创建,名字设置为dataGridView2Datasource:dataSet21Datamember:SalesOrderDetailoleDbConnection1:连接数据库AdventureWorksoleDbDataAdapter1->dataSet11oleDbDataAdapter2->dataSet21填充dataGrid控件:dataGridView1和dataGridView2private void Form1_Load(object sender, EventArgs e){oleDbDataAdapter1.Fill(dataSet11);oleDbDataAdapter2.Fill(dataSet21);}1.4数据库环境设置连接SQL Server中的默认数据库AdventureWorks2.查询功能的实现2.1实现功能代码private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) {string msg = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();String strCustomerDelete = "Select * FROM Sales.SalesOrderDetail WHERESalesOrderID =" + msg;Console.Write(strCustomerDelete);mandText = strCustomerDelete;t his.dataSet21.Clear(); //刷新this.oleDbDataAdapter2.Fill(this.dataSet21); //填充}2.2查询SalesOrderID=43661的所有订单明细3.删除功能的实现3.1实现功能代码3.2如图删除SalesOrderID=43661,SalesOrderDetailID=15的订单,结果如下点击43661后查询结果如下选择43661中SalesOrderDetailID=15的一行并点击删除按钮,则删除这行数据,如下图所示:4.插入功能的实现4.1实验指导书中已经给出介绍,SalesOrderDetail的rowguid列是一个uniqueidentifier类型,不允许空值。
手工输入该值比较困难,可以使用程序进行处理。
即手工输入时不输入该值,保存到数据库之前由程序生成该列的值。
4.2如下图在SalesOrderID=43661的订单明细的最下方添加一行新的订单没有插入新的订单之前的位置插入如图所示的新订单信息5.更新功能的实现5.1在AdventureWorks数据库中创建表Production.ProductUpdateLog,用来记录订单编号、订单明细编号、产品编号、产品的公开报价、修改前产品的单价、修改后产品的单价、修改者的登录名SQL语句如下:CREATE TABLE Production.ProductUpdateLog(记录编号int IDENTITY PRIMARY key, ---保证编号唯一,且随插入数据的数据逐一递增订单编号int not null,订单明细编号int not null,产品编号int not null,产品的公开报价money,修改前产品的单价money,修改后产品的单价money,修改者的登录名varchar(30)not null)GO创建的表如下图所示:5.2 创建名为Product.ProductUpdateCheck的存储过程,来向表Production.productUpdateLog中插入数据,实现代码如下USE AdventureWorksGOIF OBJECT_ID('Production.Record_Update_Price','P')IS NOT NULLDROP PROCEDURE Production.Record_Update_PriceGO--如果数据库中存在名称为Production.Record_Update_Price的存储过程--则删除该存储过程--创建存储过程Production.Record_Update_Price,它有个参数,--其中@SalesorderID 表示订单编号,@SalesorderdetailID 表示订单明细编号--@ProductID 表示产品编号,@PublicPrice 表示公开报价--@PrePrice 表示修改前价格,@PostPrice 表示修改后报价--@Operator 表示修改者登录名CREATE PROCEDURE Production.Record_Update_Price--@RecordID int,--因为表格ProductUpdateLog的主键设为IDENTITY性质,不用传参@SalesorderID int,@SalesorderdetailID int, @ProductID int,@PublicPrice money, @PrePrice money,@PostPrice money, @Operator nvarchar(50)AS--向表ProductUpdateLog插入一条记录,参数纷纷对应INSERT INTO Production.ProductUpdateLog(--记录编号,订单编号,订单明细编号, 产品编号,产品公开报价, 修改前产品单价,修改后产品单价, 修改者登录名)VALUES(--@RecordID,@SalesorderID,@SalesorderdetailID, @ProductID,@PublicPrice, @PrePrice,@PostPrice, @Operator)GOUSE AdventureWorksGOIF OBJECT_ID('Production.Record_Update_Price','P')IS NOT NULLDROP PROCEDURE Production.Record_Update_PriceGO--如果数据库中存在名称为Production.Record_Update_Price的存储过程--则删除该存储过程--创建存储过程Production.Record_Update_Price,它有个参数,--其中@SalesorderID 表示订单编号,@SalesorderdetailID 表示订单明细编号--@ProductID 表示产品编号,@PublicPrice 表示公开报价--@PrePrice 表示修改前价格,@PostPrice 表示修改后报价--@Operator 表示修改者登录名CREATE PROCEDURE Production.Record_Update_Price--@RecordID int,--因为表格ProductUpdateLog的主键设为IDENTITY性质,不用传参@SalesorderID int,@SalesorderdetailID int, @ProductID int,@PublicPrice money, @PrePrice money,@PostPrice money, @Operator nvarchar(50)AS--向表ProductUpdateLog插入一条记录,参数纷纷对应INSERT INTO Production.ProductUpdateLog(--记录编号,订单编号,订单明细编号, 产品编号,产品公开报价, 修改前产品单价,修改后产品单价, 修改者登录名)VALUES(--@RecordID,@SalesorderID,@SalesorderdetailID, @ProductID,@PublicPrice, @PrePrice,@PostPrice, @Operator)GO5.3建立名为Sales.Price_Update的触发器实现代码如下:USE AdventureWorksGO--如果已经存在名为Sales.Price_Update的触发器,则删除它IF OBJECT_ID('Sales.Price_Update','TR')IS NOT NULLDROP TRIGGER Sales.Price_UpdateGO--在表Sales.SalesOrderDetail的Update操作上创建--Instead of触发器Sales.Price_UpdateCREATE TRIGGER Sales.Price_UpdateON Sales.SalesOrderDetailINSTEAD OF UpdateAS--当更新插入记录的更新价格UnitPrice大于--产品的公开报价Production.Product.ListPrice时--调用RAISERROR报错,进行操作回滚IF(EXISTS( SELECT I.UnitPriceFROM Production.Product P, inserted IWHERE I.UnitPrice > P.ListPrice AND P.ProductID = I.ProductID))BEGINRAISERROR('修改的产品单价不能大于产品的公开报价!', 10, 1) ROLLBACK TRANSACTIONEND--如果符合更新价格不大于公开报价的条件--则调用存储过程Production.Record_Update_PriceELSEBEGIN--声明相对应的个参数,数据类型一致对应DECLARE @SalesorderID int,@SalesorderdetailID int,@ProductID int,@ListPrice money,@PreUnitPrice money,@PostUnitPrice money,@Operator nvarchar(50)--订单编号、订单明细编号、产品编号及产品修改后价格--皆取自表inserted相对应值SELECT @SalesorderID = SalesOrderID,@SalesorderdetailID = SalesOrderDetailID,@ProductID = ProductID,@PostUnitPrice = UnitPriceFROM inserted--产品公开报价取自表Production.Product的ListPriceSELECT @ListPrice = ListPriceFROM Production.Product PWHERE P.ProductID = (SELECT ProductIDFROM inserted)--执行更新操作,将表Sales.SalesOrderDetail所对应的记录的--UnitPrice值更新UPDATE Sales.SalesOrderDetailSET UnitPrice = @PostUnitPriceWHERE Sales.SalesOrderDetail.SalesOrderID = @SalesorderIDAND Sales.SalesOrderDetail.SalesOrderDetailID = @SalesorderdetailID--修改前的产品价格取自表中deleted--表Sales.SalesOrderDetail对应被删除的记录UnitPriceSELECT @PreUnitPrice = UnitPriceFROM deleted DWHERE D.ProductID =(SELECT ProductIDFROM inserted)--获取当前修改者登录名--在网上搜到了这个系统内置函数SELECT @Operator = SYSTEM_USER--将个参数对应位置传入存储过程Production.Record_Update_PriceEXECUTE Production.Record_Update_Price @SalesorderID,@SalesorderdetailID,@ProductID, @ListPrice,@PreUnitPrice, @PostUnitPrice,@Operator--提示已经进入存储过程PRINT 'HERE COMES A PROCEDURE...'ENDGO创建的触发器如下图所示:5.4在订单明细中修改一行中的一个数据,如输入的单价(UnitPrice)不符合产品的公开报价范围时,窗口会出现提示,并组织修改的保存6.保存功能的实现6.1保存功能实现代码private void button2_Click(object sender, EventArgs e){try{// 检查数据表各行,设置新行的rowguid列foreach (DataRow dataRow in this.dataSet21.SalesOrderDetail.Rows){// 如果是新行if (dataRow.RowState == DataRowState.Added){// 如果rowguid列的值是空值if (dataRow["rowguid"].Equals(System.DBNull.Value)){dataRow["rowguid"] = Guid.NewGuid();}}}this.oleDbDataAdapter2.Update(this.dataSet21.SalesOrderDetail);MessageBox.Show("保存成功!");}catch (Exception ex){MessageBox.Show("保存失败!\n" + ex.Message);}}6.2功能实现结果如下图,把SalesOrderID=43863&SalesOrderDetailID=671的D0C0-435D-A2修改成D0C0-435D-B2修改后点击保存按钮,结果如图所示再次查询这个SalesOrderID=43863&SalesOrderDetailID=671的订单明细,可以看到已经保存到数据库了7.关闭功能的实现7.1关闭功能实现代码private void button3_Click(object sender, EventArgs e){bool Save_Flag = true;//定义一个波尔变量save_flagfor (int i = 0; i < this.dataSet21.SalesOrderDetail.Rows.Count; i++)//全局扫描,判断是否有修改if (this.dataSet21.SalesOrderDetail.Rows[i].RowState !=DataRowState.Unchanged){Save_Flag = false;break;}if (Save_Flag == false){if(DialogResult.Yes == MessageBox.Show(" 是否要保存对订单明细的更改?", "提示", MessageBoxButtons.YesNo))//若确定则关闭窗口不保存更改数据,否则回到原来窗口this.Close();}else //若没有更改则直接关闭this.Close();}7.2关闭功能实现结果若不更改任何数据或者已经点击保存按钮,则窗口直接关闭若更改数据而没有点击保存按钮,则会弹出提示窗口,提示你订单明细已经更改,是否确认退出若点否,则回到原来的订单表窗口中若点击是,则不保存到数据库并且关闭窗口再次运行程序,查看SalesOrderID=43659&SalesOrderDetailID=4的订单是否已经保存,结果如下:很明显没有保存实验结果:实验中六个基本功能如查询、插入、删除、保存、更新和关闭已经实现了,可以通过对订单中的某个订单进行所有历史订单的查询,并通过订单明细窗口把所以信息显示出来;可以对订单明细最后一行进行插入一行新的订单数据;可以在订单明细表中选择一行数据点击删除按钮,把那行订单数据一整行删除;可以对更改的数据进行处理并保存到数据库;可以更新功能,如若是输入单价超出规定的报价,则会报错,无法进行保存;可以关闭窗口,若是订单明细的数据已经更改而没有保存,则会弹出窗口提示“订单明细更改,是否确认退出”,若是已经保存或者是没有更改订单明细的数据,而可以直接关闭窗口不会出现提示窗口。