第二个事件处理器对products的CategoryID属性重新赋值,并调用BLL层里的新的事务方法来执行数据库更新.我们注意到将每个产品的ProductID值赋给其CategoryID属性,对最开头的几个产品而言没有任何问题,但随着ProductID值越变越大,CategoryID的值也越变越大,而Category表里定义的种类毕竟有限,于是问题就出来了。
第三个事件处理器也是将ProductID值赋给CategoryID属性,只是用ProductsTableAdapter的默认的Update方法来更新数据库. 该Update方法并没有使用事务来封装这些命令,所以只要是没有违背外键约束的更新都会执行成功.
在浏览器里登录该页面进行验证.最开始你将看到如图8所示的画面,然后点“Modify Categories (WITH TRANSACTION)”.这将导致页面回传并试题更新所有products的CategoryID值,这将导致违背外键约束(见图9).
图8:Products将显示在一个分页的GridView控件里
图9:导致违背外键约束
现在点击浏览器的Back按钮,再点击“Refresh Grid”按钮,此时你看到的界面和图8的界面一摸一样。这是因为发生了违背外键约束,导致回滚,所有的操作失败.
再点“Modify Categories (WITHOUT TRANSACTION)”按钮,这同样将违背外键约束(见图9),不过这一次,那些对CategoryID属性赋以有效值的操作不会回滚.点击浏览器的Back按钮,再点“Refresh Grid”按钮。就像图10显示的那样,最开始的8个产品的CategoryID值已经发生了更改,比如,在图8里Chang的CategoryID值为1,而在图10里就变成了2了.
图10:某些Product的CategoryID值发生了改变,而其它的没有
结语:
默认情况下,TableAdapter的方法没有使用事务来执行数据库命令,不过只需多做一点工作我们就可以添加一些用于创建、提交、回滚事务的方法.在本教程,我们在ProductsTableAdapter class类里创建了这3个方法:BeginTransaction, CommitTransaction,和RollbackTransaction.我们考察了如何在try...catch模块里使用这些方法来执行一系列的修改命令.具体来说,我们在ProductsTableAdapter里创建了UpdateWithTransaction方法,该方法运用Batch Update模式对ProductsDataTable里的每行记录执行必要的更改操作;我们也对BLL里的ProductsBLL class类添加了DeleteProductsWithTransaction方法,它将一系列ProductID值作为输入参数,并使用DB-Direct模式将每个产品删除.这些方法开始都创建一个事务,再在try...catch模块里执行数据更改命令.如果抛出异常,则回滚事务,否则提交事务.
第五步演示了事务的作用。在接下来的3章我们将以本章为基础,创建批更新、批删除、批添加的用户界面.
祝编程快乐!
作者简介
本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的书,是4GuysFromRolla.com的创始人,自1998年以来一直应用 微软Web技术。大家可以点击查看全部教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望对大家的学习ASP.NET有所帮助。
您可能感兴趣的文章: