数据库系统开发实验三.docx
- 文档编号:29061532
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:23
- 大小:424.68KB
数据库系统开发实验三.docx
《数据库系统开发实验三.docx》由会员分享,可在线阅读,更多相关《数据库系统开发实验三.docx(23页珍藏版)》请在冰豆网上搜索。
数据库系统开发实验三
实验报告
姓名:
学号:
班级:
实验:
订单管理
时间:
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 AdventureWorks
GO
--如果已经存在名为Sales.Price_Update的触发器,则删除它
IF OBJECT_ID('Sales.Price_Update','TR')IS NOT NULL
DROP TRIGGER Sales.Price_Update
GO
--在表Sales.SalesOrderDetail的Update操作上创建
--Instead of触发器Sales.Price_Update
CREATE TRIGGER Sales.Price_Update
ON Sales.SalesOrderDetail
INSTEAD OF Update
AS
--当更新插入记录的更新价格UnitPrice大于
--产品的公开报价Production.Product.ListPrice时
--调用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
BEGIN
--声明相对应的个参数,数据类型一致对应
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 P
WHERE P.ProductID = (
SELECT ProductID
FROM inserted
)
--执行更新操作,将表Sales.SalesOrderDetail所对应的记录的
--UnitPrice值更新
UPDATE Sales.SalesOrderDetail
SET UnitPrice = @PostUnitPrice
WHERE Sales.SalesOrderDetail.SalesOrderID = @SalesorderID
AND Sales.SalesOrderDetail.SalesOrderDetailID = @SalesorderdetailID
--修改前的产品价格取自表中deleted
--表Sales.SalesOrderDetail对应被删除的记录UnitPrice
SELECT @PreUnitPrice = UnitPrice
FROM deleted D
WHERE D.ProductID =(
SELECT ProductID
FROM inserted
)
--获取当前修改者登录名
--在网上搜到了这个系统内置函数
SELECT @Operator = SYSTEM_USER
--将个参数对应位置传入存储过程Production.Record_Update_Price
EXECUTE Production.Record_Update_Price @SalesorderID,
@SalesorderdetailID,
@ProductID, @ListPrice,
@PreUnitPrice, @PostUnitPrice,
@Operator
--提示已经进入存储过程
PRINT 'HERE COMES A PROCEDURE...'
END
GO
创建的触发器如下图所示:
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的订单是否已经保存,结果如下: 很明显没有保存 实验结果: 实验中六个基本功能如查询、插入、删除、保存、更新和关闭已经实现了,可以通过对订单中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 系统 开发 实验