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

返回“ASP.NET 2.0数据教程目录”

导言:

正如我们在第16章《概述添加、更新、删除数据》里探讨的那 样,GridView控件内建的功能支持对每行数据的编辑和删除功能,你只需要稍稍 动一下鼠标就可以创建丰富的数据修改界面而不用写一行代码.但是,在某些情况 下,这还不够,我们需要让用户能够成批地处理数据.

比如,很多基于 web(web-based)的电子邮件客户端,将所有邮件出来,每条邮件除了包含邮件信 息(主题、发送者等)外,还包含一个checkbox控件。这些界面允许用户同时删除 多个邮件,用户只需要选中邮件,再点"删除所选邮件"按钮.当用户要 编辑多条不同的记录的时候,提供一个批编辑界面是比较理想的.我们用不着让用 户每次都选中一条要编辑的记录,再做相关的修改,最后点“更新” 按钮,在批编辑界面里每条记录都有各自的编辑选项,用户可以快速地编辑多条 记录再点“Update All”按钮来保存对他们所做的修改.本系列我们将 考察如何创建对数据进行添加、编辑、删除批处理的界面.

如果想对批处 理执行atomic operation(原子操作), 那么首先,所做的操作要么都执行成功要 么都失败,另外还要对数据访问层进行扩充以支持database transactions(数据 库事务)。数据库事务确保INSERT, UPDATE, 和 DELETE语句执行的atomicity(原 子数)置于数据库事务的保护之下.另外,绝大多数的当代数据库系统都支持数据 库事务.

在本系列我们先看如何扩充数据访问层以支持数据库事务,接下 来我们看如何创建页面以包含添加、更新、删除数据的批处理界面,让我们开始 吧.

注意:在批处理事务里修改数据时,原子数(atomicity)并非总数必要 的。在批处理的某些情况下,某些修改成功某些修改失败是可以接受的。比如删 除电子邮件时,有些邮件在删除过程中发生了数据库错误,有些邮件没有发生错 误,对这种没有发生错误的邮件,批处理照样将其删除掉.对这种情况,我们没有 必要设置数据访问层DAL支持数据库事务.不过在其它某些情况下,原子数是至关 重要的.比如某个客户想把资金从一个银行帐户转移到另一个银行帐号,下面2个 操作必须执行成功:首先,将第一个帐号的资金扣除,然后将资金转入第二个帐 号.如果第一步执行成功,第二步执行失败,银行当然高兴,客户怕是要发疯了. 在后面的文章里我们将创建添加、更新、删除的批处理界面,就算你不打算在这 些页面里使用数据库事务,我也希望你照着本篇文章,对数据访问层进行扩展一 支持数据库事务.

事务概述

绝大多数的数据库都支持事务,它可以 将多个数据库命令当成一个逻辑单位进行处理.这些包含事务的命令要么都执行成 功要么都执行失败.

一般来说,事务通过SQL命令来执行,使用如下的模式 :

1.声明事务开始

2.执行构成事务的那些SQL命令

3.如果 在第二步中的任何一个命令出错,执行事务回滚(rollback the transaction)

4.如果在第二步中的所有命令成功执行,提交事务

这些SQL命令可 以通过手写的方式输入,比如写SQL脚本、创建存储过程、也可以通过编程的方式 来构建,比如使用ADO.NET技术或调用System.Transactions namespace命名空间 的类.在本文,我们仅仅考察用ADO.NET技术管理事务.在后面的教程我们看如何在 数据访问层Data Access Layer里使用存储过程,到那时,我们再来考察这些创建 、回滚、提交事物的SQL命令。另外,要获得更多信息请参考文章《Managing Transactions in SQL Server Stored Procedures》 (http://www.4guysfromrolla.com/webtech/080305-1.shtml)

注意: System.Transactions namespace命名空间的TransactionScope class类允许开发 者通过编程的方式获取事务里的一系列命令,且允许事务包含多个数据源,甚至 类型不同,比如:Microsoft SQL Server database, 或Oracle database,甚至 Web service.本教程我们使用ADO.NET技术而非TransactionScope class类,是因 为ADO.NET指定数据库事务更详细,且在很多情况下占用资源更少.此外,在某些 情况下,TransactionScope class类要用到Microsoft Distributed Transaction Coordinator (MSDTC),围绕MSDTC的配置、执行和性能问题是比较专业、高级的 问题稍微超出了本教程的范围.

时间: 2024-09-30 17:37:48

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

ASP.NET 2.0数据教程之六十二:创建一个用户自定义的Database-Driven Site Map

返回"ASP.NET 2.0数据教程目录" ASP.NET 2.0数据教程之六十二:创建一个用户自定义的Database-Driven Site Map Provider 导言: ASP.NET 2.0的网站地图(site map)功能允许页面开发者在一些 持久介质(persistent medium),比如一个XML文件里,自己定义一个web程序的 site map.一旦定义了之后,我们可以通过System.Web命名空间的SiteMap class 类或某个Web导航控件,比如Si

ASP.NET 2.0数据教程之七十三:保护连接字符串及其它设置信息

返回"ASP.NET 2.0数据教程目录" 导言: ASP.NET应用程序的设置信息通常都存储在一个名为Web.config 的XML文件里.在教程的前面部分我们已经好几次修改过Web.config文件了.比如 在第一章,我们创建名为Northwind的数据集时,数据库连接字符串信息自动的添 加到Web.config文件的<connectionStrings>节点.再后来,在第3章里,我 们手动更新了Web.config文件,添加了一个<pages>元素,对所有

ASP.NET 2.0数据教程之六十九:在TableAdapter里使用JOINs

返回"ASP.NET 2.0数据教程目录" 导言: 在关系数据库里,我们处理的数据通常跨越了几个数据表.举 例:当展示产品信息时我们很可能想列出每个产品相应的category以及供应商的 名称等.诚然,Products表里包含有CategoryID 和SupplierID值,但是事实上的 category以及supplier names分别定义在Categories表和Suppliers表里. 要从其 它的相关表里获取信息,我们可以使用correlated subqueries或JOI

ASP.NET 2.0数据教程之六十八:在TableAdapters里使用现有的存储过程

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的文章里我们考察了如何让TableAdapters向导自动的创 建存储过程.而在本文,我们将考察如何让TableAdapter使用现有的存储过程.由 于Northwind数据库现有的存储过程很少,我们也需要考察如何在Visual Studio 环境里手动向数据库添加新的存储过程. 注意: 在第63章 <Wrapping Database Modifications within a Transaction>里我们向

ASP.NET 2.0数据教程之六十七:在TableAdapters里创建新的存储过程

返回"ASP.NET 2.0数据教程目录" 导言: 本教程的Data Access Layer (DAL)使用的是类型化的数据集 (Typed DataSets).就像我们在第一章<Creating aData Access Layer>里探讨 的一样,该类型化的数据集由强类型的DataTable和TableAdapter构成. DataTable描绘的是系统里的逻辑实体而TableAdapter引用相关数据库执行数据访 问,包括对DataTable填充数据.执行返回标量数

ASP.NET 2.0数据教程之六十六:批添加数据

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的第64章<Batch Updating>里,我们用GridView控件 里定制了一个批编辑界面,同样的我们也可以定制一个批添加界面.假设有这种情 况,我们接受一批从Tokyo(东京)发过来的货物:6种不同的tea 和 coffee,如果 用户在一个DetailsView控件里一次输入一个产品,他将会重复的输入很多相同的 值,比如相同的种类(Beverages),相同的供应商(Tokyo Traders),相同的 d

ASP.NET 2.0数据教程之六十五:批删除数据

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的教程,我们用GridView创建了一个批编辑界面.在用户需 要一次性编辑多条记录的情况下,批编辑界面很有用.同理,当用户需要同时删 除多条记录时,该技术也很有用. 如果你使用过邮件系统的话,你应该对 这种最常见的批删除界面很熟悉:界面里每一行都包含一个checkbox,此外,还 有一个"Delete All Checked Items"按钮(如图1).本教程比较短, 因为我们在前面的教程已经完成大体的框架,

ASP.NET 2.0数据教程之六十四:批更新数据

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的教程,我们对数据访问层进行扩展以支持数据库事务. 数据库事务确保一系列的操作要么都成功,要么都失败.本文我们将注意力转到 创建一个批更新数据界面. 在本文,我们将创建一个GridView控件,里面 的每一行记录都可以进行编辑(见图1),因此我们没有必要多添加一列来包含 Edit, Update,和Cancel按钮,而是在页面包含2个"Update Products"按钮,被点击时,遍历所有的产品并对数据库进

ASP.NET 2.0数据教程之六十一:使用SQL Cache Dependencies

返回"ASP.NET 2.0数据教程目录" 导言: 在58和59章探讨的缓存技术使用的是基于时间的缓存周期,当 过了某段时间后便将缓存数据从内存清除.当设置缓存时间为x秒时,数据在x秒 内都是"新"的.当然,就像在60章谈到的那样,对静态数据来说,x 可延伸到web应用程序的整个生命周期(lifetime). 当缓存数据时,基于 时间周期的技术因为其易用性而常常被采用,不过又常常不那么完美.理想的状 态是这样的:数据库数据还是应缓存在内存,直到源数据(underly