收藏 分享(赏)

数据库系统开发实验三.doc

上传人:tangtianxu1 文档编号:2984030 上传时间:2018-10-01 格式:DOC 页数:27 大小:1.08MB
下载 相关 举报
数据库系统开发实验三.doc_第1页
第1页 / 共27页
数据库系统开发实验三.doc_第2页
第2页 / 共27页
数据库系统开发实验三.doc_第3页
第3页 / 共27页
数据库系统开发实验三.doc_第4页
第4页 / 共27页
数据库系统开发实验三.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师实验报告姓名: 学号: 班级: 实验: 订单管理 时间: 2017 年 9 月 28 日 2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师1目录一、 实验目的(通过实验要达到什么样的效果,学到什么东西)二、 实验条件(实验使用软件)三、 实验内容(实验需要做的具体详细的实验项目)四、 实验要求(实验中,我们要注意的实验事项和写实验报告的详细要求)五、 实验步骤(实验步骤包括具体的每个实验的实验方法、实验结果和实验结果分析,按照每步遇到

2、的问题,进行分析解决)六、 实验感悟(总结实验中遇到的问题,以后该怎么解决)2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师2一、实验目的学习数据库应用程序的开发和实现部分功能(查询、插入、删除、更新和保存等)二、实验条件Microsoft SQL Server Management StudioMicrosoft Visual StudioWindows 8C#编程语言3、实验内容编程实现示例数据库中订单明细 SalesOrderDetail 的查询、插入、更新与删除功能如下:(1 )查询功能。程序运行后,订单表中显示所有订单,第一个订单为当前订单,订单明细表中显示当前

3、订单的所有订单明细。当前订单发生改变时(即点击订单表中的某个订单埋),订单明细表中的内容发生相应的变化。(2 ) 删除功能:选取订单明细中的一行,点击删除,选择的订单明细从表中删除,但并不真正从数据库中删除。(3 ) 插入功能:可以在订单明细表的最后输入新的订单明细。2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师3(4 ) 更新功能:可以修改订单明细表中的某一行的内容。如果输入的单价(UnitPrice)大于产品的公开报价,则提示相应的信息(利用 4.6.2 的触发器完成此功能)。(5 ) 保存功能:点击保存按钮时,将订单明细保存到数据库。(6 )关闭功能:点击关闭按钮

4、时,如果订单明细有修改但没有保存,则提示是否关闭,如果不关闭则返回,否则关闭程序,如果没有修改,则直接关闭。四、实验要求1.订单查询实验要求使用 ADO.NET 并任选一种程序设计语言进行编程。实验报告需要说明所采用的方法、结果和总结(结果分析)。实验方法部分说明采用的开发环境,包括操作系统、数据库管理系统及其版本、编程工具及其版本、和编程语言。如果使用 ADO.NET 则在实验方法部分回答下面的问题:(1 ) 使用哪种数据提供程序?(2 ) 使用的数据连接对象是哪一个?连接对象是如何建立的?最后生成的连接对象中的连接字符串是什么?代表什么含义?(3 ) 使用的数据适配器对象是什么?其中的查询

5、或更新语句是什么?如果有参数则参数是如何处理的?(4 ) 使用的数据集对象是什么?数据集中有哪些数据表?数据表是由哪些适配器对象生成的?(或采用其它方法)。实验方法中还需要给出手工添加的代码及对代码的说明。实验结果部分给出程序运行的界面和操作的简单说明。总结部分对实验过程中出现的总是进行分析,同时提出所开发的程序还有哪些可以改进的地方。5、实验步骤实验方法:2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师4回答实验要求中的实验问题(1 )使用哪种数据提供程序?答:OLEDB 类数据。(2 )使用的数据连接对象是哪一个?连接对象是如何建立的?最后生成的连接对象中的连接字符串

6、是什么?代表什么含义?答:连接对象 oleDbConnection1数据适配器:oleDbDataAdapter1 和 oleDbDataAdapter2oleDbDataAdapter1Provider=SQLNCLI11(客户端组件,代表一个驱动)Data Source=LENOVO-PC(代表数据源是 LENOVO-PC)Security=SSPI(代表以 window 用户登录服务器)Initial Catlog=AdventureWorks(代表连接数据库为 AdventureWorks)oleDbDataAdapter2Provider=SQLNCLI11(客户端组件,代表一个驱动

7、)Data Source=LENOVO-PC(代表数据源是 LENOVO-PC)Security=SSPI(代表以 window 用户登录服务器)Initial Catlog=AdventureWorks(代表连接数据库为 AdventureWorks)(3 ) 使用的数据适配器对象是什么?其中的查询或更新语句是什么?如果有参数则参数是如何处理的?答:oleDbDataAdapter1:1)查询语句:SELECT SalesOrderID, OrderDate, DueDate, ShipDate, Status, SalesOrderNumber2017 年 9 月 8 日大三暑假小学期 数

8、据库系统开发-郭贵锁老师5FROM Sales.SalesOrderHeader2)没有参数OleDbDataAdapter2:1) 查询语句:SELECT SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber, OrderQty, ProductID, SpecialOfferID, UnitPrice, UnitPriceDiscount, LineTotal, rowguid, ModifiedDateFROM Sales.SalesOrderDetail2)没有参数(4 )使用的数据集对象是什么?数据集中有哪些数据表?数据表是由

9、哪些适配器对象生成的?(或采用其它方法)。答:dataSet11-SalesOrderHeader 表-oleDbDataAdapter1dataSet21-SalesOrderDetail 表-oleDbDataAdapter21.基本框架设计介绍1.1 新建一个项目客户管理 4.0,选择的参数如下2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师61.2打开新建的项目客户管理 4.01.3 窗口进行如下图所示的设计订单:使用 dataGridView 创建,名字设置为 dataGridView1Datasource:dataSet11Datamember:SalesOr

10、derHeader订单明细:使用 datagridview 创建,名字设置为 dataGridView2Datasource:dataSet21Datamember:SalesOrderDetailoleDbConnection1:连接数据库 AdventureWorksoleDbDataAdapter1-dataSet11oleDbDataAdapter2-dataSet212017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师7填充 dataGrid控件:dataGridView1 和 dataGridView2private void Form1_Load(object

11、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 = dataGridView1e.ColumnIndex, e.RowIndex.Value.ToSt

12、ring();String strCustomerDelete = “Select * FROM Sales.SalesOrderDetail WHERE SalesOrderID =“ + msg;Console.Write(strCustomerDelete);oleDbDataAdapter2.SelectCommand.CommandText = strCustomerDelete;this.dataSet21.Clear(); /刷新this.oleDbDataAdapter2.Fill(this.dataSet21); /填充2017 年 9 月 8 日大三暑假小学期 数据库系统开

13、发-郭贵锁老师82.2查询 SalesOrderID=43661的所有订单明细3.删除功能的实现3.1实现功能代码3.2如图删除 SalesOrderID=43661,SalesOrderDetailID=15的订单,结果如下点击 43661后查询结果如下选择 43661 中 SalesOrderDetailID=15 的一行并点击删除按钮,则删除这行数据,如下图所示:2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师94.插入功能的实现4.1 实验指导书中已经给出介绍,SalesOrderDetail 的 rowguid 列是一个 uniqueidentifier类型,不

14、允许空值。手工输入该值比较困难,可以使用程序进行处理。即手工输入时不输入该值,保存到数据库之前由程序生成该列的值。4.2 如下图在 SalesOrderID=43661 的订单明细的最下方添加一行新的订单没有插入新的订单之前的位置2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师10插入如图所示的新订单信息5.更新功能的实现5.1 在 AdventureWorks 数据库中创建表 Production.ProductUpdateLog,用来记录订单编号、订单明细编号、产品编号、产品的公开报价、修改前产品的单价、修改后产品的单价、修改者的登录名SQL 语句如下:CREATE

15、TABLE Production.ProductUpdateLog(记录编号 int IDENTITY PRIMARY key, -保证编号唯一,且随插入数据的数据逐一递增2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师11订单编号 int not null,订单明细编号 int not null,产品编号 int not null,产品的公开报价 money,修改前产品的单价 money,修改后产品的单价 money,修改者的登录名 varchar(30) not null)GO创建的表如下图所示:5.2 创建名为Product.ProductUpdateCheck的存

16、储过程,来向表Production.productUpdateLog中插入数据,实现代码如下USE AdventureWorksGOIF OBJECT_ID(Production.Record_Update_Price,P)IS NOT NULL2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师12DROP PROCEDURE Production.Record_Update_PriceGO-如果数据库中存在名称为 Production.Record_Update_Price 的存储过程-则删除该存储过程-创建存储过程 Production.Record_Update_Pr

17、ice,它有个参数,-其中SalesorderID 表示订单编号,SalesorderdetailID 表示订单明细编号-ProductID 表示产品编号,PublicPrice 表示公开报价-PrePrice 表示修改前价格,PostPrice 表示修改后报价-Operator 表示修改者登录名CREATE PROCEDURE Production.Record_Update_Price-RecordID int,-因为表格 ProductUpdateLog 的主键设为 IDENTITY 性质,不用传参SalesorderID int,SalesorderdetailID int, Prod

18、uctID int,PublicPrice money, PrePrice money,PostPrice money, Operator nvarchar(50)AS-向表 ProductUpdateLog 插入一条记录,参数纷纷对应INSERT INTO Production.ProductUpdateLog(-记录编号,2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师13订单编号,订单明细编号, 产品编号,产品公开报价, 修改前产品单价,修改后产品单价, 修改者登录名)VALUES(-RecordID,SalesorderID,SalesorderdetailID,

19、 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,它有个参数,2017 年 9 月 8 日大三暑假

20、小学期 数据库系统开发-郭贵锁老师14-其中SalesorderID 表示订单编号,SalesorderdetailID 表示订单明细编号-ProductID 表示产品编号,PublicPrice 表示公开报价-PrePrice 表示修改前价格,PostPrice 表示修改后报价-Operator 表示修改者登录名CREATE PROCEDURE Production.Record_Update_Price-RecordID int,-因为表格 ProductUpdateLog 的主键设为 IDENTITY 性质,不用传参SalesorderID int,SalesorderdetailID

21、int, ProductID int,PublicPrice money, PrePrice money,PostPrice money, Operator nvarchar(50)AS-向表 ProductUpdateLog 插入一条记录,参数纷纷对应INSERT INTO Production.ProductUpdateLog(-记录编号,订单编号,订单明细编号, 产品编号,产品公开报价, 修改前产品单价,修改后产品单价, 修改者登录名)VALUES2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师15(-RecordID,SalesorderID,Salesorder

22、detailID, 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 触发器 Sal

23、es.Price_UpdateCREATE TRIGGER Sales.Price_Update ON Sales.SalesOrderDetailINSTEAD OF UpdateAS-当更新插入记录的更新价格 UnitPrice 大于-产品的公开报价 Production.Product.ListPrice 时-调用 RAISERROR 报错,进行操作回滚IF(EXISTS( SELECT I.UnitPriceFROM Production.Product P, inserted I2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师16WHERE I.UnitPric

24、e 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,PostUni

25、tPrice money,Operator nvarchar(50)-订单编号、订单明细编号、产品编号及产品修改后价格-皆取自表 inserted 相对应值SELECT SalesorderID = SalesOrderID,SalesorderdetailID = SalesOrderDetailID,ProductID = ProductID,PostUnitPrice = UnitPrice FROM inserted-产品公开报价取自表 Production.Product 的 ListPrice SELECT ListPrice = ListPrice FROM Production

26、.Product PWHERE P.ProductID = (SELECT ProductIDFROM inserted)-执行更新操作,将表 Sales.SalesOrderDetail 所对应的记录的-UnitPrice 值更新2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师17UPDATE Sales.SalesOrderDetailSET UnitPrice = PostUnitPriceWHERE Sales.SalesOrderDetail.SalesOrderID = SalesorderIDAND Sales.SalesOrderDetail.SalesO

27、rderDetailID = SalesorderdetailID-修改前的产品价格取自表中 deleted-表 Sales.SalesOrderDetail 对应被删除的记录 UnitPriceSELECT PreUnitPrice = UnitPrice FROM deleted DWHERE D.ProductID =( SELECT ProductIDFROM inserted )-获取当前修改者登录名-在网上搜到了这个系统内置函数SELECT Operator = SYSTEM_USER-将个参数对应位置传入存储过程 Production.Record_Update_PriceEXE

28、CUTE Production.Record_Update_Price SalesorderID, SalesorderdetailID,ProductID, ListPrice,PreUnitPrice, PostUnitPrice,Operator-提示已经进入存储过程PRINT HERE COMES A PROCEDURE.ENDGO创建的触发器如下图所示:2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师185.4 在订单明细中修改一行中的一个数据,如输入的单价(UnitPrice)不符合产品的公开报价范围时,窗口会出现提示,并组织修改的保存6.保存功能的实现6.1

29、 保存功能实现代码private void button2_Click(object sender, EventArgs e)try/ 检查数据表各行,设置新行的 rowguid列foreach (DataRow dataRow in this.dataSet21.SalesOrderDetail.Rows)2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师19/ 如果是新行if (dataRow.RowState = DataRowState.Added)/ 如果 rowguid列的值是空值 if (dataRow“rowguid“.Equals(System.DBNul

30、l.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/定义一个波尔变量 save_flagfor (int i = 0; i this.dataSet21.SalesOrderDetail.Rows.Coun

31、t; i+)/全局扫描,判断是否有修改if (this.dataSet21.SalesOrderDetail.Rowsi.RowState != DataRowState.Unchanged)Save_Flag = false;break;if (Save_Flag = false) if (DialogResult.Yes = MessageBox.Show(“ 是否要保存对订单明细的更改?“, “提示“, MessageBoxButtons.YesNo)2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师22/若确定则关闭窗口不保存更改数据,否则回到原来窗口this.Cl

32、ose();else /若没有更改则直接关闭this.Close();7.2 关闭功能实现结果若不更改任何数据或者已经点击保存按钮,则窗口直接关闭若更改数据而没有点击保存按钮,则会弹出提示窗口,提示你订单明细已经更改,是否确认退出2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师23若点否,则回到原来的订单表窗口中若点击是,则不保存到数据库并且关闭窗口再次运行程序,查看 SalesOrderID=43659&SalesOrderDetailID=4 的订单是否已经保存,结果如下:很明显没有保存2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师24实验结果

33、:实验中六个基本功能如查询、插入、删除、保存、更新和关闭已经实现了,可以通过对订单中的某个订单进行所有历史订单的查询,并通过订单明细窗口把所以信息显示出来;可以对订单明细最后一行进行插入一行新的订单数据;可以在订单明细表中选择一行数据点击删除按钮,把那行订单数据一整行删除;可以对更改的数据进行处理并保存到数据库;可以更新功能,如若是输入单价超出规定的报价,则会报错,无法进行保存;可以关闭窗口,若是订单明细的数据已经更改而没有保存,则会弹出窗口提示“订单明细更改,是否确认退出”,若是已经保存或者是没有更改订单明细的数据,而可以直接关闭窗口不会出现提示窗口。结果分析:查询功能:需要从订单中获取信息

34、并在订单明细中显示出来,实验中,我使用的是 dataGridView,可以直接双击 dataGridView1 进入到代码窗口(form1.cs),输入要写的代码,实现功能,也可以在 dataGridView 的属性中使用 mouseclick 建立一个函数,也可以实现这个查询的功能;2017 年 9 月 8 日大三暑假小学期 数据库系统开发-郭贵锁老师25插入功能:刚开始实现这个功能时,总是报错,仔细看了实验指导书,才发现是rowguid 出现的问题,然后就可以进行插入了;删除功能:双击删除按钮进入到代码编辑窗口,输入代码进行调试,代码没有问题,删除功能实现;保存功能:双击保存功能按钮进入到

35、代码编辑窗口,输入代码调试运行,解决出现的 bug,实现保存功能;更新功能:在数据库 AdventureWorks 中进行操作,建表、插入存储、创建触发器,实现更新功能;关闭功能:先全局搜索判断订单明细是否更改,然后把结果返回到波尔变量Save_flag 中,然后根据 Save_flag,若是 false,则弹出提示窗口,否则直接关闭窗口;可以改进的功能:查询功能:可以直接输入相关信息直接查询所有的订单明细插入功能:提示插入格式删除功能:删除前弹出窗口进行删除确认保存功能:每次保存提示”保存成功”更新功能:可以在选择上增加功能若选否则保存关闭,若选是则直接关闭关闭功能:可以查询修改的订单明细六、实验感悟

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 专业基础教材

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报