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

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

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

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

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

(4)

(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

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

oleDbDataAdapter1:

1)查询语句:

SELECTSalesOrderID,OrderDate,DueDate,ShipDate,Status,SalesOrderNumber

FROMSales.SalesOrderHeader

2)没有参数

OleDbDataAdapter2:

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

UnitPriceDiscount,LineTotal,rowguid,ModifiedDate

FROMSales.SalesOrderDetail

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

dataSet11->

SalesOrderHeader表->

dataSet21->

SalesOrderDetail表->

1.基本框架设计介绍

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

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

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

订单:

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

Datasource:

dataSet11

Datamember:

SalesOrderHeader

订单明细:

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

Datasource:

dataSet21

SalesOrderDetail

oleDbConnection1:

连接数据库AdventureWorks

oleDbDataAdapter1->

oleDbDataAdapter2->

填充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);

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

IFOBJECT_ID('

Production.Record_Update_Price'

'

P'

)ISNOTNULL

DROPPROCEDUREProduction.Record_Update_Price

--如果数据库中存在名称为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

5.3建立名为Sales.Price_Update的触发器

实现代码如下:

USE?

AdventureWorks

--如果已经存在名为Sales.Price_Update的触发器,则删除它

IF?

OBJECT_ID('

Sales.Price_Update'

TR'

)IS?

NOT?

NULL

DROP?

TRIGGER?

Sales.Price_Update

--在表Sales.SalesOrderDetail的Update操作上创建

--Instead?

of触发器Sales.Price_Update

CREATE?

Sales.Price_Update?

?

ON?

Sales.SalesOrderDetail

INSTEAD?

OF?

Update

--当更新插入记录的更新价格UnitPrice大于

--调用RAISERROR报错,进行操作回滚

IF(EXISTS(?

SELECT?

I.UnitPrice

FROM?

Production.Product?

P,?

inserted?

I

WHERE?

I.UnitPrice?

>

P.ListPrice?

AND?

P.ProductID?

=?

I.ProductID))

BEGIN

RAISERROR('

修改的产品单价不能大于产品的公开报价!

'

?

10,1)?

ROLLBACK?

TRANSACTION

END

--如果符合更新价格不大于公开报价的条件

--则调用存储过程Production.Record_Update_Price

ELSE

--声明相对应的个参数,数据类型一致对应

DECLARE?

@SalesorderID?

int,

@SalesorderdetailID?

@ProductID?

@ListPrice?

money,

@PreUnitPrice?

@PostUnitPrice?

@Operator?

nvarchar(50)

--订单编号、订单明细编号、产品编号及产品修改后价格

--皆取自表inserted相对应值

SalesOrderID,

SalesOrderDetailID,

ProductID,

UnitPrice?

inserted

--产品公开报价取自表Production.Product的ListPrice?

ListPrice?

P

ProductID

--执行更新操作,将表Sales.SalesOrderDetail所对应的记录的

--UnitPrice值更新

UPDATE?

SET?

@PostUnitPrice

 

--修改前的产品价格取自表中deleted

--表Sales.SalesOrderDetail对应被删除的记录UnitPrice

deleted?

D

D.ProductID?

=(?

inserted?

--获取当前修改者登录名

--在网上搜到了这个系统内置函数

SYSTEM_USER

--将个参数对应位置传入存储过程Production.Record_Update_Price

EXECUTE?

Production.Record_Update_Price?

@SalesorderID,?

@SalesorderdetailID,

@ProductID,?

@ListPrice,

@PreUnitPrice,?

@PostUnitPrice,

@Operator

--提示已经进入存储过程

PRINT?

HERE?

COMES?

A?

PROCEDURE...'

创建的触发器如下图所示:

5.4在订单明细中修改一行中的一个数据,如输入的单价(UnitPrice)不符合产品的公开报价范围时,窗口会出现提示,并组织修改的保存

6.保存功能的实现

6.1保存功能实现代码

privatevoidbutton2_Click(objectsender,EventArgse)

try

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

foreach(DataRowdataRowinthis

//如果是新行

if(dataRow.RowState==DataRowState.Added)

//如果rowguid列的值是空值

if(dataRow["

rowguid"

].Equals(System.DBNull.Value))

dataRow["

]=Guid.NewGuid();

this.oleDbDataAdapter2.Update(this.dataSet21.SalesOrderDetail);

MessageBox.Show("

保存成功!

"

);

catch(Exceptionex)

保存失败!

\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<

this

//全局扫描,判断是否有修改

if(thisDataRowState.Unchanged)

Save_Flag=false;

break;

if(Save_Flag==false)

{

if(DialogResult.Yes==MessageBox.Show("

是否要保存对订单明细的更改?

"

提示"

MessageBoxButtons.YesNo))

//若确定则关闭窗口不保存更改数据,否则回到原来窗口

this.Close();

else//若没有更改则直接关闭

7.2关闭功能实现结果

若不更改任何数据或者已经点击保存按钮,则窗口直接关闭

若更改数据而没有点击保存按钮,则会弹出提示窗口,提示你订单明细已经更改,是否确认退出

若点否,则回到原来的订单表窗口中

若点击是,则不保存到数据库并且关闭窗口

再次运行程序,查看SalesOrderID=43659&

SalesOrderDetailID=4的订单是否已经保存,结果如下:

很明显没有保存

实验结果:

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

可以对订单明细最后一行进行插入一行新的订单数据;

可以在订单明细表中选择一行数据点击删除按钮,把那行订单数据一整行删除;

可以对更改的数据进行处理并保存到数据库;

可以更新功能,如若是输入单价超出规定的报价,则会报错,无法进行保存;

可以关闭窗口,若是订单明细的数据已经更改而没有保存,则会弹出窗口提示“订单明细更改,是否确认退出”,若是已经保存或者是没有更改订单明细的数据,而可以直接关闭窗口不会出现提示窗口。

结果分析:

查询功能:

需要从订单中获取信息并在订单明细中显示出来,实验中,我使用的是dataGridView,可以直接双击dataGridView1进入到代码窗口(form1.cs),输入要写的代码,实现功能,也可以在dataGridView的属性中使用mouseclick建立一个函数,也可以实现这个查询的功能;

插入功能:

刚开始实现这个功能时,总是报错,仔细看了实验指导书,才发现是rowguid出现的问题,然后就可以进行插入了;

删除功能:

双击删除按钮进入到代码编辑窗口,输入代码进行调试,代码没有问题,删除功能实现;

保存功能:

双击保存功能按钮进入到代码编辑窗口,输入代码调试

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

当前位置:首页 > 经管营销 > 经济市场

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

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