ASP.NET 2.0数据教程之六十八:在TableAdapters里使用现有的存储过程
执行出错,那么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所示). 图13:每条Category记录都包含Edit 和 Delete按钮 图14:你无法删除有对应产品的Category 我们希望可以删除任 何一个category,不管其是否有对应的产品.当删除category时,我们同样希望删 除其对应的产品(尽管我们可以简单的将这些产品的CategoryID值设置为NULL).为 此,我们可以创建一个存储过程,它接受一个输入参数@CategoryID。当调用它时 明确的将所有对应的product删除,然后再将这个category删掉. 人们的第 一反应是创建类似下面的存储过程:
上述代码明白无误的将相关的product以及该 category删除,只是没有置身于一个事务内.假设还有其它的基于Categorie表 CategoryID值的外键约束,那么在这种情况下问题就出来了:对该category来说 ,其相关的product都删除掉了,而这个category因与其它表还有外键约束而仍然 保留在数据库. 如果该存储过程置身于一个事务里的话,对Categories表 的删除操作失败将导致对Products表的删除操作回滚.下面的存储过程脚本使用一 个事务来确保对这2个DELETE statement的原子操作:
花点时间向Northwind数据库添加一个名为 Categories_Delete的存储过程,具体步骤可参考第一步. 第六步:更新 CategoriesTableAdapter 一旦我们添加完Categories_Delete存储过程后 ,DAL层就可以使用ad-hoc SQL statements来执行删除操作了.不过我们需要更新 CategoriesTableAdapter,使其使用Categories_ |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |