电子商务之存储过程分析(六)
这个系统中存储过程有很多是值得我学习的,首先让我学习到了在存储过程中事务的编写,事务可以让我们确保同时在数据库中插入几张表数据,就算发生错误也可产生“回滚”让数据库回复初始状态,并自定义显示出错误,不会发生只插入了一张表的数据,而其他几张表的数据没有插入的情况。虽然以前接触到如果同时在数据库中插入几张表数据,可以用触发器,但是自己一直没有机会用到触发器,对它的印象不深。
用户数据存储:

CREATEPROCEDURE[dbo].[EndUser_Insert]
@UserNamenvarchar(50),
@AddressLinenvarchar(50),
@AddressLine2nvarchar(50),
@Citynvarchar(50),
@Provincenvarchar(50),
@PostalCodenvarchar(50),
@Phonenvarchar(50),
@Phone2nvarchar(50),
@Faxnvarchar(50),
@Emailnvarchar(50),
@EndUserTypeIDint,
@Passwordnvarchar(50),
@IsSuBscribedint
AS
--事物(同时插入三张表)
BEGINTRANSACTION
DECLARE@AddressIDint
DECLARE@ContactInfomationIDint
INSERTINTOdt_Address
(AddressLine,
AddressLine2,
City,
Province,
PostalCode)
VALUES
(@AddressLine,
@AddressLine2,
@City,
@Province,
@PostalCode)
--记录了最后插入地址的标识值,这里得到的是地址编号
SET@AddressID=@@IDENTITY
--回滚,这里是产生了错误
IF@@ERROR<>0
BEGIN
/*ROLLBACK如果事务中出现错误,或用户决定取消事务,则回滚该事务。
ROLLBACK语句通过将数据返回到它在事务开始时所处的状态,来取消
事务中的所有修改。ROLLBACK还释放事务占用的资源。*/
ROLLBACK
--显示错误并返回
RAISERROR('ErrorINSERTINTOdt_Address.',16,1)
RETURN
END
INSERTINTOdt_ContactInformation
(Phone,
Phone2,
Fax,
Email)
VALUES
(@Phone,
@Phone2,
@Fax,
@Email)
SET@ContactInfomationID=@@IDENTITY
IF@@ERROR<>0
BEGIN
ROLLBACK
RAISERROR('ErrorINSERTINTOdt_ContactInformation.',16,1)
RETURN
END
INSERTINTOdt_EndUser
(EndUserTypeID,
UserName,
AddressID,
ContactInformationID,
Password,
IsSubscribed)
VALUES
(@EndUserTypeID,
@UserName,
@AddressID,
@ContactInfomationID,
@Password,
@IsSubscribed)
SELECT@@IDENTITY
IF@@ERROR<>0
BEGIN
ROLLBACK
RAISERROR('ErrorINSERTINTOdt_EndUser',16,1)
RETURN
END
--如果事务成功,则提交。COMMIT语句保证事务的所有修改在数据库中都永久有效。COMMIT语句还释放事务使用的资源
COMMIT
上面是将数据存储到dt_Address,dt_EndUser,dt_ContactInformation这三表中去,插入其中任何一张表发生错误,就会产生回滚,从而使数据库恢复到原来的状态。
其次在看一个产品的搜索存储过程:

CREATEPROCEDURE[dbo].[Products_SelectSerach]
@SerachCriterianvarchar(255)
AS
SELECT
ProductID,
ProductName,
ProductCategoryName,
ProductImageName,
SUBSTRING(ProductDescription,1,150)+'

ProductPrice
FROMdt_Products
INNERJOINdt_ProductCategory
ONdt_Products.ProductCategoryID=dt_ProductCategory.ProductCategoryID
WHERE
ProductCategoryNameLIKE'%'+@SerachCriteria+'%'
OR
ProductNameLIKE'%'+@SerachCriteria+'%'
OR
ProductDescriptionLIKE'%'+@SerachCriteria+'%'
通过输入一些词语,查找dt_Products和dt_Products两张表中ProductCategoryName,ProductName,ProductDescription三个字段中包含这些词语的数据。我个人觉得这段搜索的代码会给我们有所收获。
不知道有没有朋友知道像百度那样输入一句或关键字,自己提炼这句话中的关键字,然后在数据库进行查找。
订单的插入:

CREATEPROCEDURE[dbo].[Order_Insert]
@EndUserIDint,
@TransactionIDnvarchar(50)
AS
INSERTINTOdt_Orders
(EndUserId,
TransactionID,
OrderDate)
VALUES
(@EndUserID,
@TransactionID,
getdate())
--返回得到的值是刚刚插入的订单编号
SELECT@@IDENTITY
详细订单的插入:

CREATEPROCEDURE[dbo].[OrderDetails_Insert]
@OrderIDint,
@ProductIDint,
@Quantityint
AS
INSERTINTOdt_OrderDetails
(OrderID,
ProductID,
Quantity)
VALUES
(@OrderID,
@ProductID,
@ProductID)
给出上面的存储过程是因为要在后面分析如何在数据层完成上面的事务的编写。
其余的存储过程,都是一些简单增 删 查 改操作我就不一一的介绍了,需要了解的朋友可以去看看原作。
然后向大家道歉:电子商务之数据存储流程(五)开头说,“选存储过程+传递参数用SqlParameter是因为,除非是ADO.NET有漏洞,那么就绝对不会发生SQL注入”这句话,有朋友提出来,这是错误的。这句话我是看网上人说的,自己对这方面也不太了解。但是非常高兴有人指出我的随笔错误之处。让我认识到我知识上的错误。我希望了解的朋友能发发这方面的文章,让我们学习一下。