快速业务通道

ASP.NET 2.0数据教程之六十八:在TableAdapters里使用现有的存储过程

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
执行出错,那么CATCH区域的ROLLBACK TRANSACTION将数据 库返回到开始前的状态。存储过程也会通过RAISERROR command命令抛出一个 SqlException异常.

注意:上面代码的的TRY...CATCH模式是SQL Server 2005里新添加的,如果你使用的是Microsoft SQL Server稍微旧点的版本的话, 上面的代码不会成功执行。不过你可以参考这篇文章《Managing Transactions in SQL Server Stored Procedures》 (http://www.4guysfromrolla.com/webtech/080305-1.shtml)以寻求帮 助.

让我们看一个实实在在的例子。在Categories表和Products表之间有 一个外键约束,这意味着,Products表里的CategoryID列必须要与Categories表 里的CategoryID值吻合.如果某个category有对应的product,而我们试图删除该 category时将会导致违背外键约束.我们来进行演示,登录这个页面 (~/BinaryData/UpdatingAndDeleting.aspx),该页面列出了系统里的所有 category,且每行都包含Edit和Delete按钮(如图13),如果你尝试删除一个有对 应product的category时,比如Beverages——删除失败,因为违背了 外键约束(如图14所示).

ASP.NET 2.0数据教程之六十八:在TableAdapters里使用现有的存储过程

图13:每条Category记录都包含Edit 和 Delete按钮

ASP.NET 2.0数据教程之六十八:在TableAdapters里使用现有的存储过程

图14:你无法删除有对应产品的Category

我们希望可以删除任 何一个category,不管其是否有对应的产品.当删除category时,我们同样希望删 除其对应的产品(尽管我们可以简单的将这些产品的CategoryID值设置为NULL).为 此,我们可以创建一个存储过程,它接受一个输入参数@CategoryID。当调用它时 明确的将所有对应的product删除,然后再将这个category删掉.

人们的第 一反应是创建类似下面的存储过程:

CREATE PROCEDURE dbo.Categories_Delete
(
  @CategoryID int
)
AS

-- First, delete the associated products...
DELETE FROM Products
WHERE CategoryID = @CategoryID

-- Now delete the category
DELETE FROM Categories
WHERE CategoryID = @CategoryID

上述代码明白无误的将相关的product以及该 category删除,只是没有置身于一个事务内.假设还有其它的基于Categorie表 CategoryID值的外键约束,那么在这种情况下问题就出来了:对该category来说 ,其相关的product都删除掉了,而这个category因与其它表还有外键约束而仍然 保留在数据库.

如果该存储过程置身于一个事务里的话,对Categories表 的删除操作失败将导致对Products表的删除操作回滚.下面的存储过程脚本使用一 个事务来确保对这2个DELETE statement的原子操作:

CREATE PROCEDURE dbo.Categories_Delete
(
  @CategoryID int
)
AS

BEGIN TRY
 BEGIN TRANSACTION -- Start the transaction

 -- First, delete the associated products...
 DELETE FROM Products
 WHERE CategoryID = @CategoryID

 -- Now delete the category
 DELETE FROM Categories
  WHERE CategoryID = @CategoryID

 -- If we reach here, success!
 COMMIT TRANSACTION
END TRY
BEGIN CATCH
 -- Whoops, there was an error
 ROLLBACK TRANSACTION

 -- Raise an error with the
 -- details of the exception 
 DECLARE @ErrMsg nvarchar(4000),
     @ErrSeverity int

 SELECT @ErrMsg = ERROR_MESSAGE(),
     @ErrSeverity = ERROR_SEVERITY()
 RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH

花点时间向Northwind数据库添加一个名为 Categories_Delete的存储过程,具体步骤可参考第一步.

第六步:更新 CategoriesTableAdapter

一旦我们添加完Categories_Delete存储过程后 ,DAL层就可以使用ad-hoc SQL statements来执行删除操作了.不过我们需要更新 CategoriesTableAdapter,使其使用Categories_

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号