快速业务通道

ASP.NET 2.0数据教程之六十三:在事务里对数据库修改进行封装

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
_Click(object sender, EventArgs e)
{
  // Get the set of products
   ProductsBLL productsAPI = new ProductsBLL();
   Northwind.ProductsDataTable products = productsAPI.GetProducts();

  // Update each product''s CategoryID
  foreach (Northwind.ProductsRow product in products)
  {
     product.CategoryID = product.ProductID;
  }

  // Update the data WITHOUT using a transaction
   NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
     new NorthwindTableAdapters.ProductsTableAdapter();
   productsAdapter.Update(products);

  // Refresh the Grid
  Products.DataBind();
}

refresh按钮的Click事件处 理器仅仅调用Products GridView的DataBind方法将数据重新绑定到ridView控 件.

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

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

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

ASP.NET 2.0数据教程之六十三:在事务里对数据库修改进行封装

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

ASP.NET 2.0数据教程之六十三:在事务里对数据库修改进行封装

图9:导致违背外键约束

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

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

ASP.NET 2.0数据教程之六十三:在事务里对数据库修改进行封装

图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技术 。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号