电子商务之存储过程分析(六)
这个系统中存储过程有很多是值得我学习的,首先让我学习到了在存储过程中事务的编写,事务可以让我们确保同时在数据库中插入几张表数据,就算发生错误也可产生“回滚”让数据库回复初始状态,并自定义显示出错误,不会发生只插入了一张表的数据,而其他几张表的数据没有插入的情况。虽然以前接触到如果同时在数据库中插入几张表数据,可以用触发器,但是自己一直没有机会用到触发器,对它的印象不深。
用户数据存储:
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
CREATE PROCEDURE [dbo].[EndUser_Insert]
@UserName nvarchar(50),
@AddressLine nvarchar(50),
@AddressLine2 nvarchar(50),
@City nvarchar(50),
@Province nvarchar(50),
@PostalCode nvarchar(50),
@Phone nvarchar(50),
@Phone2 nvarchar(50),
@Fax nvarchar(50),
@Email nvarchar(50),
@EndUserTypeID int,
@Password nvarchar(50),
@IsSuBscribed int
AS
--事物(同时插入三张表)
BEGIN TRANSACTION
DECLARE @AddressID int
DECLARE @ContactInfomationID int
INSERT INTO dt_Address
(AddressLine,
AddressLine2,
City,
Province,
PostalCode)
VALUES
(@AddressLine,
@AddressLine2,
@City,
@Province,
@PostalCode)
--记录了最后插入地址的标识值,这里得到的是地址编号
SET @AddressID=@@IDENTITY
--回滚,这里是产生了错误
IF @@ERROR<>0
BEGIN
/*ROLLBACK如果事务中出现错误,或用户决定取消事务,则回滚该事务。
ROLLBACK 语句通过将数据返回到它在事务开始时所处的状态,来取消
事务中的所有修改。ROLLBACK 还释放事务占用的资源。*/
ROLLBACK
--显示错误并返回
RAISERROR('Error INSERT INTO dt_Address.',16,1)
RETURN
END
INSERT INTO dt_ContactInformation
(Phone,
Phone2,
Fax,
Email)
VALUES
(@Phone,
@Phone2,
@Fax,
@Email)
SET @ContactInfomationID=@@IDENTITY
IF @@ERROR<>0
BEGIN
ROLLBACK
RAISERROR('Error INSERT INTO dt_ContactInformation.',16,1)
RETURN
END
INSERT INTO dt_EndUser
(EndUserTypeID,
UserName,
AddressID,
ContactInformationID,
Password,
IsSubscribed)
VALUES
(@EndUserTypeID,
@UserName,
@AddressID,
@ContactInfomationID,
@Password,
@IsSubscribed)
SELECT @@IDENTITY
IF @@ERROR<>0
BEGIN
ROLLBACK
RAISERROR('Error INSERT INTO dt_EndUser',16,1)
RETURN
END
--如果事务成功,则提交。COMMIT 语句保证事务的所有修改在数据库中都永久有效。COMMIT 语句还释放事务使用的资源
COMMIT
上面是将数据存储到dt_Address,dt_EndUser,dt_ContactInformation这三表中去,插入其中任何一张表发生错误,就会产生回滚,从而使数据库恢复到原来的状态。
其次在看一个产品的搜索存储过程:
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
CREATE PROCEDURE [dbo].[Products_SelectSerach]
@SerachCriteria nvarchar(255)
AS
SELECT
ProductID,
ProductName,
ProductCategoryName,
ProductImageName,
SUBSTRING(ProductDescription,1,150)+'
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
ProductPrice
FROM dt_Products
INNER JOIN dt_ProductCategory
ON dt_Products.ProductCategoryID=dt_ProductCategory.ProductCategoryID
WHERE
ProductCategoryName LIKE '%'+@SerachCriteria+'%'
OR
ProductName LIKE '%'+@SerachCriteria+'%'
OR
ProductDescription LIKE '%'+@SerachCriteria+'%'
通过输入一些词语,查找dt_Products和dt_Products两张表中ProductCategoryName,ProductName,ProductDescription三个字段中包含这些词语的数据。我个人觉得这段搜索的代码会给我们有所收获。
不知道有没有朋友知道像百度那样输入一句或关键字,自己提炼这句话中的关键字,然后在数据库进行查找。
订单的插入:
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
CREATE PROCEDURE [dbo].[Order_Insert]
@EndUserID int,
@TransactionID nvarchar(50)
AS
INSERT INTO dt_Orders
(EndUserId,
TransactionID,
OrderDate)
VALUES
(@EndUserID,
@TransactionID,
getdate())
--返回得到的值是刚刚插入的订单编号
SELECT @@IDENTITY
详细订单的插入:
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
CREATE PROCEDURE [dbo].[OrderDetails_Insert]
@OrderID int,
@ProductID int,
@Quantity int
AS
INSERT INTO dt_OrderDetails
(OrderID,
ProductID,
Quantity)
VALUES
(@OrderID,
@ProductID,
@ProductID)
给出上面的存储过程是因为要在后面分析如何在数据层完成上面的事务的编写。
其余的存储过程,都是一些简单增 删 查 改操作我就不一一的介绍了,需要了解的朋友可以去看看原作。
然后向大家道歉:电子商务之数据存储流程(五)开头说,“选存储过程+传递参数用SqlParameter是因为,除非是ADO.NET有漏洞,那么就绝对不会发生SQL注入”这句话,有朋友提出来,这是错误的。这句话我是看网上人说的,自己对这方面也不太了解。但是非常高兴有人指出我的随笔错误之处。让我认识到我知识上的错误。我希望了解的朋友能发发这方面的文章,让我们学习一下。
同系列文章
- 电子商务之框架分析(一)
- 电子商务之数据库分析(二)
- 电子商务之Common类库分析(三)
- 电子商务之集成选项分析(四)
- 电子商务之数据存储流程(五)
- 电子商务之存储过程分析(六)
- 电子商务之数据访问层分析(七)
- 电子商务之购物车分析(八)
- 电子商务之表示层分析(九)