




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2017年9月8日大三暑假小学期 数据库系统开发-郭贵锁老师实验报告姓名: 学号: 班级: 实验: 订单管理 时间: 2017年9月28日 目录一、 实验目的(通过实验要达到什么样的效果,学到什么东西)二、 实验条件(实验使用软件)三、 实验内容(实验需要做的具体详细的实验项目)四、 实验要求(实验中,我们要注意的实验事项和写实验报告的详细要求)五、 实验步骤(实验步骤包括具体的每个实验的实验方法、实验结果和实验结果分析,按照每步遇到的问题,进行分析解决)六、 实验感悟(总结实验中遇到的问题,以后该怎么解决)一、实验目的学习数据库应用程序的开发和实现部分功能(查询、插入、删除、更新和保存等)二、实验条件Microsoft SQL Server Management StudioMicrosoft Visual StudioWindows 8C#编程语言3、 实验内容编程实现示例数据库中订单明细SalesOrderDetail的查询、插入、更新与删除功能如下:(1)查询功能。程序运行后,订单表中显示所有订单,第一个订单为当前订单,订单明细表中显示当前订单的所有订单明细。当前订单发生改变时(即点击订单表中的某个订单埋),订单明细表中的内容发生相应的变化。(2) 删除功能:选取订单明细中的一行,点击删除,选择的订单明细从表中删除,但并不真正从数据库中删除。(3) 插入功能:可以在订单明细表的最后输入新的订单明细。(4) 更新功能:可以修改订单明细表中的某一行的内容。如果输入的单价(UnitPrice)大于产品的公开报价,则提示相应的信息(利用4.6.2的触发器完成此功能)。(5) 保存功能:点击保存按钮时,将订单明细保存到数据库。(6)关闭功能:点击关闭按钮时,如果订单明细有修改但没有保存,则提示是否关闭,如果不关闭则返回,否则关闭程序,如果没有修改,则直接关闭。四、实验要求1.订单查询实验要求使用ADO.NET并任选一种程序设计语言进行编程。实验报告需要说明所采用的方法、结果和总结(结果分析)。实验方法部分说明采用的开发环境,包括操作系统、数据库管理系统及其版本、编程工具及其版本、和编程语言。如果使用ADO.NET则在实验方法部分回答下面的问题:(1) 使用哪种数据提供程序?(2) 使用的数据连接对象是哪一个?连接对象是如何建立的?最后生成的连接对象中的连接字符串是什么?代表什么含义?(3) 使用的数据适配器对象是什么?其中的查询或更新语句是什么?如果有参数则参数是如何处理的?(4) 使用的数据集对象是什么?数据集中有哪些数据表?数据表是由哪些适配器对象生成的?(或采用其它方法)。实验方法中还需要给出手工添加的代码及对代码的说明。实验结果部分给出程序运行的界面和操作的简单说明。总结部分对实验过程中出现的总是进行分析,同时提出所开发的程序还有哪些可以改进的地方。5、 实验步骤实验方法:回答实验要求中的实验问题(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.0 1.3窗口进行如下图所示的设计订单:使用dataGridView创建,名字设置为dataGridView1 Datasource:dataSet11Datamember:SalesOrderHeader订单明细:使用datagridview创建,名字设置为dataGridView2Datasource:dataSet21Datamember:SalesOrderDetailoleDbConnection1:连接数据库AdventureWorksoleDbDataAdapter1-dataSet11oleDbDataAdapter2-dataSet21填充dataGrid控件:dataGridView1和dataGridView2 private 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 = dataGridView1e.ColumnIndex, e.RowIndex.Value.ToString(); String strCustomerDelete = Select * FROM Sales.SalesOrderDetail WHERE SalesOrderID = + msg; Console.Write(strCustomerDelete); oleDbDataAdapter2.SelectCommand.CommandText = strCustomerDelete; this.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的存储过程,来向表PductUpdateLog中插入数据,实现代码如下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的触发器实现代码如下:USEAdventureWorksGO-如果已经存在名为Sales.Price_Update的触发器,则删除它IFOBJECT_ID(Sales.Price_Update,TR)ISNOTNULLDROPTRIGGERSales.Price_UpdateGO-在表Sales.SalesOrderDetail的Update操作上创建-Insteadof触发器Sales.Price_UpdateCREATETRIGGERSales.Price_UpdateONSales.SalesOrderDetailINSTEADOFUpdateAS-当更新插入记录的更新价格UnitPrice大于-产品的公开报价Production.Product.ListPrice时-调用RAISERROR报错,进行操作回滚IF(EXISTS(SELECTI.UnitPriceFROMProduction.ProductP,insertedIWHEREI.UnitPriceP.ListPriceANDP.ProductID=I.ProductID)BEGINRAISERROR(修改的产品单价不能大于产品的公开报价!,10, 1)ROLLBACKTRANSACTIONEND-如果符合更新价格不大于公开报价的条件-则调用存储过程Production.Record_Update_PriceELSEBEGIN-声明相对应的个参数,数据类型一致对应DECLARESalesorderIDint,SalesorderdetailIDint,ProductIDint,ListPricemoney,PreUnitPricemoney,PostUnitPricemoney,Operatornvarchar(50)-订单编号、订单明细编号、产品编号及产品修改后价格-皆取自表inserted相对应值SELECTSalesorderID=SalesOrderID,SalesorderdetailID=SalesOrderDetailID,ProductID=ProductID,PostUnitPrice=UnitPriceFROMinserted-产品公开报价取自表Production.Product的ListPrice SELECTListPrice=ListPriceFROMProduction.ProductPWHEREP.ProductID=(SELECTProductIDFROMinserted)-执行更新操作,将表Sales.SalesOrderDetail所对应的记录的-UnitPrice值更新UPDATESales.SalesOrderDetailSETUnitPrice=PostUnitPriceWHERESales.SalesOrderDetail.SalesOrderID=SalesorderIDANDSales.SalesOrderDetail.SalesOrderDetailID=SalesorderdetailID-修改前的产品价格取自表中deleted-表Sales.SalesOrderDetail对应被删除的记录UnitPriceSELECTPreUnitPrice=UnitPriceFROMdeletedDWHERED.ProductID=(SELECTProductIDFROMinserted )-获取当前修改者登录名-在网上搜到了这个系统内置函数SELECTOperator=SYSTEM_USER-将个参数对应位置传入存储过程Production.Record_Update_PriceEXECUTEProduction.Record_Update_PriceSalesorderID,SalesorderdetailID,ProductID,ListPrice,PreUnitPrice,PostUnitPrice,Operator-提示已经进入存储过程PRINTHERECOMESAPROCEDURE.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 (dataRowrowguid.Equals(System.DBNull.Value) dataRowrowguid = 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_flag for (int i = 0; i this.dataSet21.SalesOrderDetail.Rows.Count; i+)/全局扫描,判断是否有修改 if (this.dataSet21.SalesOrderDetail.Rowsi.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关闭功能实现结果若不更改任何数据或者已经点击保存按钮,则窗口直接关闭若更改数据而没有点击保存按钮,则会弹出提示窗口,提示你订单明细已经更改,是否确认退出若
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 温度的课件教学课件
- 小飞虫课件绿色圃
- 小雪消防安全知识培训课件
- 班主任习惯培养经验分享与案例分析
- 高考英语作文范文参考及写作技巧
- 石窟艺术文物保护专项技术方案
- 小车换轮胎知识培训
- 2025年修补漆项目立项申请报告模板
- 2025年卸气柱项目立项申请报告模板
- 2025年PET胶水项目申请报告
- 多媒体教室使用的课件
- 2025年军队专业技能岗位文职人员招聘考试(工程机械驾驶员)历年参考题库含答案详解(5卷)
- 2025年下半年广西现代物流集团社会招聘校园招聘笔试参考题库附带答案详解(10套)
- 2025年粉笔辅警考试题库
- 水声传感器技术研究与应用
- 2025年小学教研室教学计划
- 2025年上海市建筑工程施工合同模板
- 手术室护理业务学习
- 贩卖人口罪与强迫劳动罪
- 新员工入职职业道德培训
- 宽带宣传活动方案
评论
0/150
提交评论