电子商务之存储过程分析(六)

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

  用户数据存储:

ContractedBlock.gif ExpandedBlockStart.gif Code
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这三表中去,插入其中任何一张表发生错误,就会产生回滚,从而使数据库恢复到原来的状态。

  其次在看一个产品的搜索存储过程:

ContractedBlock.gif ExpandedBlockStart.gif Code
CREATE PROCEDURE [dbo].[Products_SelectSerach]

@SerachCriteria nvarchar(255)

AS

SELECT 
ProductID,
ProductName,
ProductCategoryName,
ProductImageName,
SUBSTRING(ProductDescription,1,150)+'' AS ProductDescription,
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三个字段中包含这些词语的数据。我个人觉得这段搜索的代码会给我们有所收获。

不知道有没有朋友知道像百度那样输入一句或关键字,自己提炼这句话中的关键字,然后在数据库进行查找。

   订单的插入:

ContractedBlock.gif ExpandedBlockStart.gif Code
CREATE PROCEDURE [dbo].[Order_Insert]

@EndUserID int,
@TransactionID nvarchar(50)

AS

INSERT INTO dt_Orders
(EndUserId,
TransactionID,
OrderDate)
VALUES
(
@EndUserID,
@TransactionID,
getdate())

--返回得到的值是刚刚插入的订单编号
SELECT @@IDENTITY

   详细订单的插入:

ContractedBlock.gif ExpandedBlockStart.gif Code
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注入”这句话,有朋友提出来,这是错误的。这句话我是看网上人说的,自己对这方面也不太了解。但是非常高兴有人指出我的随笔错误之处。让我认识到我知识上的错误。我希望了解的朋友能发发这方面的文章,让我们学习一下。

 

转载于:https://www.cnblogs.com/couhujia/archive/2009/11/24/1608487.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值