// Create the SqlTransaction object SqlTransaction myTransaction = SqlConnectionObject.BeginTransaction(); try { /* * ... Perform the database transaction's data modification statements... */ // If we reach here, no errors, so commit the transaction myTransaction.Commit(); } catch { // If we reach here, there was an error, so rollback the transaction myTransaction.Rollback(); throw; }
默认情况下,强类型数据集(Typed DataSet)里的TableAdapters并不使用事务。为此,我们要对TableAdapter classes类进行扩展,以包含额外的方法以使用上述模式来执行事务。在第二步,我们看如何使用一个partial classes类来添加这些方法.
第一步:创建批处理数据的页面
在我们考察如何扩展数据访问层DAL以支持数据库事务之前,让我们花点时间来创建一些ASP.NET web页面,我们在本章及后面三章将用到它们.
添加一个名为BatchData的新文件夹,再添加如下的 ASP.NET页面, 务必套用Site.master模板页.
Default.aspx
Transactions.aspx
BatchUpdate.aspx
BatchDelete.aspx
BatchInsert.aspx
图1:添加相关的页面
就像其它文件夹里的Default.aspx页面一样,用SectionLevelTutorialListing.ascx用户控件来列出本部分的章节。将其从解决资源管理器里拖到Default.aspx页面.
图2:将SectionLevelTutorialListing.ascx用户控件添加到Default.aspx页面
最后添加如下代码到Web.sitemap文件,具体的,将其添加到“Customizing the Site Map” <siteMapNode>后面:
<siteMapNode title="Working with Batched Data" url="~/BatchData/Default.aspx" description="Learn how to perform batch operations as opposed to per-row operations."> <siteMapNode title="Adding Support for Transactions" url="~/BatchData/Transactions.aspx" description="See how to extend the Data Access Layer to support database transactions." /> <siteMapNode title="Batch Updating" url="~/BatchData/BatchUpdate.aspx" description="Build a batch updating interface, where each row in a GridView is editable." /> <siteMapNode title="Batch Deleting" url="~/BatchData/BatchDelete.aspx" description="Explore how to create an interface for batch deleting by adding a CheckBox to each GridView row." /> <siteMapNode title="Batch Inserting" url="~/BatchData/BatchInsert.aspx" description="Examine the steps needed to create a batch inserting interface, where multiple records can be created at the click of a button." /> </siteMapNode>
完成后,花几分钟在浏览器里登录页面,左面的菜单列出了本部分的各项
图3:Site Map现在包含了本章节
第二步:更新数据访问层以支持数据库事务
就像我们在第一章《创建一个数据访问层》探讨的一样,位于数据访问层的强类型数据集(Typed DataSet)由DataTables 和 TableAdapters构成. DataTables保存数据,而TableAdapters提供相应的方法从数据库读取数据,并根据DataTables的改动对数据库做相应的更新,等等.记得TableAdapters有2种更新数据的模式——Batch Update 和 DB-Direct.就Batch Update模式而言, TableAdapter可以传入DataSet, DataTable, 或DataRows集,遍历这些数据对要添加、修改、删除的行执行相应的InsertCommand, UpdateCommand, or DeleteCommand方法。就DB-Direct模式而言,TableAdapter传入的是那些需要进行添加、更新、删除操作的某条记录的列的值,再使用这些值执行相关的InsertCommand, UpdateCommand, 或DeleteCommand命令.
TableAdapter自动生成的方法并不使用事务.默认状态下,TableAdapter执行的每一个insert, update, 或delete操作都看作是单独的、互不相干的.假定在业务逻辑层BLL里使用DB-Direct模式来向数据库添加十条记录,代码将分十次调用TableAdapter的Insert方法. 如果前5条记录添加正常,而在添加第六条记录时发生异常,前5条记录仍然保存在数据库.同样的,用Batch Update模式来操作的话,效果亦然.