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

上传人:b****8 文档编号:9818723 上传时间:2023-02-06 格式:DOCX 页数:22 大小:425.86KB
下载 相关 举报
数据库系统开发实验三.docx_第1页
第1页 / 共22页
数据库系统开发实验三.docx_第2页
第2页 / 共22页
数据库系统开发实验三.docx_第3页
第3页 / 共22页
数据库系统开发实验三.docx_第4页
第4页 / 共22页
数据库系统开发实验三.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

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

《数据库系统开发实验三.docx》由会员分享,可在线阅读,更多相关《数据库系统开发实验三.docx(22页珍藏版)》请在冰豆网上搜索。

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

数据库系统开发实验三

Forpersonaluseonlyinstudyandresearch;notforcommercialuse

Forpersonaluseonlyinstudyandresearch;notforcommercialuse

实验报告

姓名:

学号:

班级:

实验:

订单管理

时间:

2017年9月28日

 

 

目录

一、实验目的

(通过实验要达到什么样的效果,学到什么东西)

二、实验条件

(实验使用软件)

三、实验内容

(实验需要做的具体详细的实验项目)

四、实验要求

(实验中,我们要注意的实验事项和写实验报告的详细要求)

五、实验步骤

(实验步骤包括具体的每个实验的实验方法、实验结果和实验结果分析,按照每步遇到的问题,进行分析解决)

六、实验感悟

(总结实验中遇到的问题,以后该怎么解决)

一、实验目的

学习数据库应用程序的开发和实现部分功能(查询、插入、删除、更新和保存等)

二、实验条件

MicrosoftSQLServerManagementStudio

MicrosoftVisualStudio

Windows8

C#编程语言

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和oleDbDataAdapter2

oleDbDataAdapter1

Provider=SQLNCLI11(客户端组件,代表一个驱动)

DataSource=LENOVO-PC(代表数据源是LENOVO-PC)

Security=SSPI(代表以window用户登录服务器)

InitialCatlog=AdventureWorks

(代表连接数据库为AdventureWorks)

oleDbDataAdapter2

Provider=SQLNCLI11(客户端组件,代表一个驱动)

DataSource=LENOVO-PC(代表数据源是LENOVO-PC)

Security=SSPI(代表以window用户登录服务器)

InitialCatlog=AdventureWorks

(代表连接数据库为AdventureWorks)

(3)使用的数据适配器对象是什么?

其中的查询或更新语句是什么?

如果有参数则参数是如何处理的?

答:

oleDbDataAdapter1:

1)查询语句:

SELECTSalesOrderID,OrderDate,DueDate,ShipDate,Status,SalesOrderNumber

FROMSales.SalesOrderHeader

2)没有参数

OleDbDataAdapter2:

1)查询语句:

SELECTSalesOrderID,SalesOrderDetailID,CarrierTrackingNumber,OrderQty,ProductID,SpecialOfferID,UnitPrice,

UnitPriceDiscount,LineTotal,rowguid,ModifiedDate

FROMSales.SalesOrderDetail

2)没有参数

(4)使用的数据集对象是什么?

数据集中有哪些数据表?

数据表是由哪些适配器对象生成的?

(或采用其它方法)。

答:

dataSet11->SalesOrderHeader表->oleDbDataAdapter1

dataSet21->SalesOrderDetail表->oleDbDataAdapter2

1.基本框架设计介绍

1.1新建一个项目客户管理4.0,选择的参数如下

1.2打开新建的项目客户管理4.0

1.3窗口进行如下图所示的设计

订单:

使用dataGridView创建,名字设置为dataGridView1

Datasource:

dataSet11

Datamember:

SalesOrderHeader

订单明细:

使用datagridview创建,名字设置为dataGridView2

Datasource:

dataSet21

Datamember:

SalesOrderDetail

oleDbConnection1:

连接数据库AdventureWorks

oleDbDataAdapter1->dataSet11

oleDbDataAdapter2->dataSet21

填充dataGrid控件:

dataGridView1和dataGridView2

privatevoidForm1_Load(objectsender,EventArgse)

{

oleDbDataAdapter1.Fill(dataSet11);

oleDbDataAdapter2.Fill(dataSet21);

}

1.4数据库环境设置

连接SQLServer中的默认数据库AdventureWorks

 

2.查询功能的实现

2.1实现功能代码

privatevoiddataGridView1_CellContentClick(objectsender,DataGridViewCellEventArgse)

{

stringmsg=dataGridView1[e.ColumnIndex,e.RowIndex].Value.ToString();

StringstrCustomerDelete="Select*FROMSales.SalesOrderDetailWHERESalesOrderID="+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语句如下:

CREATETABLEProduction.ProductUpdateLog(

记录编号intIDENTITYPRIMARYkey,---保证编号唯一,且随插入数据的数据逐一递增

订单编号intnotnull,

订单明细编号intnotnull,

产品编号intnotnull,

产品的公开报价money,

修改前产品的单价money,

修改后产品的单价money,

修改者的登录名varchar(30)notnull

GO

 

创建的表如下图所示:

5.2创建名为Product.ProductUpdateCheck的存储过程,来向表Production.productUpdateLog中插入数据,

实现代码如下

USEAdventureWorks

GO

IFOBJECT_ID('Production.Record_Update_Price','P')ISNOTNULL

DROPPROCEDUREProduction.Record_Update_Price

GO

--如果数据库中存在名称为Production.Record_Update_Price的存储过程

--则删除该存储过程

--创建存储过程Production.Record_Update_Price,它有个参数,

--其中@SalesorderID表示订单编号,@SalesorderdetailID表示订单明细编号

--@ProductID表示产品编号,@PublicPrice表示公开报价

--@PrePrice表示修改前价格,@PostPrice表示修改后报价

--@Operator表示修改者登录名

CREATEPROCEDUREProduction.Record_Update_Price

--@RecordIDint,

--因为表格ProductUpdateLog的主键设为IDENTITY性质,不用传参

@SalesorderIDint,

@SalesorderdetailIDint,@ProductIDint,

@PublicPricemoney,@PrePricemoney,

@PostPricemoney,@Operatornvarchar(50)

AS

--向表ProductUpdateLog插入一条记录,参数纷纷对应

INSERTINTOProduction.ProductUpdateLog

--记录编号,

订单编号,

订单明细编号,产品编号,

产品公开报价,修改前产品单价,

修改后产品单价,修改者登录名

VALUES

--@RecordID,

@SalesorderID,

@SalesorderdetailID,@ProductID,

@PublicPrice,@PrePrice,

@PostPrice,@Operator

GO

USEAdventureWorks

GO

IFOBJECT_ID('Production.Record_Update_Price','P')ISNOTNULL

DROPPROCEDUREProduction.Record_Update_Price

GO

--如果数据库中存在名称为Production.Record_Update_Price的存储过程

--则删除该存储过程

--创建存储过程Production.Record_Update_Price,它有个参数,

--其中@SalesorderID表示订单编号,@SalesorderdetailID表示订单明细编号

--@ProductID表示产品编号,@PublicPrice表示公开报价

--@PrePrice表示修改前价格,@PostPrice表示修改后报价

--@Operator表示修改者登录名

CREATEPROCEDUREProduction.Record_Update_Price

--@RecordIDint,

--因为表格ProductUpdateLog的主键设为IDENTITY性质,不用传参

@SalesorderIDint,

@SalesorderdetailIDint,@ProductIDint,

@PublicPricemoney,@PrePricemoney,

@PostPricemoney,@Operatornvarchar(50)

AS

--向表ProductUpdateLog插入一条记录,参数纷纷对应

INSERTINTOProduction.ProductUpdateLog

--记录编号,

订单编号,

订单明细编号,产品编号,

产品公开报价,修改前产品单价,

修改后产品单价,修改者登录名

VALUES

--@RecordID,

@SalesorderID,

@SalesorderdetailID,@ProductID,

@PublicPrice,@PrePrice,

@PostPrice,@Operator

GO

5.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_Update  ON 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 = UnitPrice    FROM inserted--产品公开报价取自表Production.Product的ListPrice   SELECT @ListPrice = ListPrice FROM 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 = UnitPrice FROM 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保存功能实现代码

privatevoidbutton2_Click(objectsender,EventArgse)

{

try

{

//检查数据表各行,设置新行的rowguid列

foreach(DataRowdataRowinthis.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(Exceptionex)

{

MessageBox.Show("保存失败!

\n"+ex.Message);

}

}

6.2功能实现结果

如下图,把SalesOrderID=43863&SalesOrderDetailID=671的D0C0-435D-A2修改成D0C0-435D-B2

修改后点击保存按钮,结果如图所示

再次查询这个SalesOrderID=43863&SalesOrderDetailID=671的订单明细,可以看到已经保存到数据库了

7.关闭功能的实现

7.1关闭功能实现代码

privatevoidbutton3_Click(objectsender,EventArgse)

{

boolSave_Flag=true;//定义一个波尔变量save_flag

for(inti=0;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的订单是否已经保存,结果如下:

很明显没有保存

 

实验结果:

实验中六个基本功能如查询、插入、删除、保存、更新和关闭已经实现了,可以通过对订单中的某个订单进行所有历史订单的查询,并通过订单明细窗口把所以信息显示出来;

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

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1