在ASP.NET 2.0中操作数据之六十一:在事务里对数据(6)

  第二个事件处理器对products的CategoryID属性重新赋值,并调用BLL层里的新的事务方法来执行数据库更新.我们注意到将每个产品的ProductID值赋给其CategoryID属性,对最开头的几个产品而言没有任何问题,但随着ProductID值越变越大,CategoryID的值也越变越大,而Category表里定义的种类毕竟有限,于是问题就出来了。

  第三个事件处理器也是将ProductID值赋给CategoryID属性,只是用ProductsTableAdapter的默认的Update方法来更新数据库. 该Update方法并没有使用事务来封装这些命令,所以只要是没有违背外键约束的更新都会执行成功.

  在浏览器里登录该页面进行验证.最开始你将看到如图8所示的画面,然后点“Modify Categories (WITH TRANSACTION)”.这将导致页面回传并试题更新所有products的CategoryID值,这将导致违背外键约束(见图9).

/uploads/allimg/200612/1H2563261_0.gif


图8:Products将显示在一个分页的GridView控件里

/uploads/allimg/200612/1H254bD_0.gif


图9:导致违背外键约束

  现在点击浏览器的Back按钮,再点击“Refresh Grid”按钮,此时你看到的界面和图8的界面一摸一样。这是因为发生了违背外键约束,导致回滚,所有的操作失败.

  再点“Modify Categories (WITHOUT TRANSACTION)”按钮,这同样将违背外键约束(见图9),不过这一次,那些对CategoryID属性赋以有效值的操作不会回滚.点击浏览器的Back按钮,再点“Refresh Grid”按钮。就像图10显示的那样,最开始的8个产品的CategoryID值已经发生了更改,比如,在图8里Chang的CategoryID值为1,而在图10里就变成了2了.

/uploads/allimg/200612/1H2549362_0.gif


图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有所帮助。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjyppz.html