Accessing and Updating Data in ASP.NET 2.0: Examining the Data Source Control's Events

                                                                                                                                                   Written by Scott Mitchell  
                                                                                                                                                   Translated by jiangyh

简介

ASP.NET 2.0数据控件提供了一个简单、直接的方法去访问和修改数据。Data Source Control Basics是一篇入门级的文章,这篇文章的一系列练习教给了我们如何向一个页面追加数据控件、对指定的数据源进行抽出和/或修改操作和如何绑定数据到一个web控件(例如GridViewDetailsViewFormView)上。用这种点击和选择的方式去设定访问数据的方法非常适合新手和没有经验的程序爱好者,这些向导的方式访问数据对于有经验的程序员来讲却是比较麻烦的,由于这样使程序缺少了扩展和自定义的空间。然而,ASP.NET 2.0数据控件却解决了这两方面的问题,依我看,它们不但可以快速而且简单的对数据进行配置和使用,而且通过使用数据控件生命周期中引发的大量事件,在一些特殊的情况下给程序提供了很多的灵活性。

 

SqlDataSourceSqlDataSource是两个非常通用的数据控件,它们分别提供了一个方法从任何一个数据库或者数据源去取得和修改数据。两个数据控件在selectinginsertingupdatingdeleting执行前和提交后的时候都引发了一些事件。例如,SqlDataSourceObjectDataSource控件在执行查询SQL或者调用取得数据的方法的时候就引发了Selecting事件。在数据取得完成以后又引发了selected事件。通过创建一个Selecting事件句柄,你可以检查或者表示检索的参数;在Selected事件中,可以做一些其他的事情,比如处理在执行操作中出现了异常。类似的updatinginsertingdeleting操作前和后引发的事件,和select也是一样的。

 

非常清楚数据控件事件和事件的生命周期会有很多的好处。现实中很多情况都是在selectinginsertingupdating或者deleting这些执行前事件中分配和改变数据。而且,漂亮的处理数据库和数据源级别的异常,在执行后事件中是非常好的。并且,当调试的时候,执行前事件还可以提供给我们一个机会去检查检索数据用的参数是否正确。让我们开始学习吧。

 

数据控件事件模式

SqlDataSourceObjectDataSource控件提供了一些方法去索,更新,插入和除数据(Select(), Insert(), Update(), and Delete().这些方法可以通过程序来调用,但是通常的情况下是自动的被已经绑定好的数据控件调用。当SqlDataSource控件的Select()被调用的时候,他将建立一个指定的连接到数据库,然后执行SelectCommand法,并且返回一个DataView或者DataReader(这个依赖于DataSourceMode属性的设定)。当ObjectDataSource控件的Select()方法被调用的时候,他的配置对象将被实例化,并且它指定的方法将会被调用,方法的结果将会从Select()方法返回。

 

尽管SqlDataSourceObjectDataSource控件的Select()方法的内部有些不同,但是两个控件都是一样的事件模式。对于Select()Insert()Update()Delete()这四个方法,SqlDataSourceObjectDataSource将会引发处理前和处理后事件。一个事件执行比较优先,另一个事件随后执行。通过事件的名字可以判断是在方法执行前出发还是执行后出发。Selecting事件在取得数据前被引发,然后Select方法被执行,最后引发了Selected方法,下面的图解说明了这个模式。

                      

 

上图描述了ObjectDataSource控件的Select()方法,Insert()Update()Delete()方法还有SqlDataSource控件的4个方法和上面的模式一样。对于概念SqlDataSourceObjectDataSource控件是完全一致的,但是实现的细节有些不同。

 

SqlDataSource控件的执行前事件的练习

SqlDataSource控件的执行前事件传递的是Command对象的一个引用,用来执行数据库访问,Command对象中包含了一些信息。Command对象CommandText属性包含着执行的SQL语句或者存储过程名。Command对象还包含了用于查询的参数集合。

 

如果你希望输出SELECTINSERTUPDATE或者DELETE 语句中的参数,你就可以适当的使用不同的执行前事件。例如,用下面的代码去构造带有一个SelectCommand对象的SqlDataSource控件。

 

SELECT 
FROM Employees
WHERE Salary > @Salary 

SqlDataSource控件的<SelectParameters>集合包含了一个参数。这个参数的指定方法有很多,可以直接声明,可以写一个不变的值或者从页面上取得一个值,或者是一个查询来的值等等。不管怎么样,你的这个参数的值都可以在Selecting事件中被检查或者修改(如果你需要的话)。(请参照Filtering Database Data with Parameters文章去获得如何使用数据控件参数

 

对于SqlDataSource控件,你可以通过e.Command.Parameters("parameterName")代码去取得或者改变@Salary参数的值。

 

Protected Sub CategoriesDataSource_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles CategoriesDataSource.Selecting
   
'Set parameter value through e.Command.Parameters
   e.Command.Parameters("@Salary").Value = 50000
End Sub 

请参照Change the Value of the Data Source Control's Update and Insert Parameters文章去了解更多的关于如何设置数据控件参数的信息。

 

请通过文章下面的链接去下载例子代码,其中演示了如何通过SqlDataSource控件去取得和修改CommandText对象中的所有参数。这对于调试的时候输出信息是非常有用的。

 

ObjectDataSource控件的执行前事件的练习

SqlDataSource控件一样,ObjectDataSource的执行前事件也提供了一个机会去自定义要传入执行处理的参数。代替了SqlDataSourceCommand对象,ObjectDataSource的执行前事件传递过来的是一个叫做InputParametersdictionary对象,其中也包含了一些参数和值。

 

例如,就象下面的代码演示的,我们的业务对象调用了GetEmployeesByDepartmentID(departmentID)方法,其中的整型输入参数将被使用去取得制定部门内的所有员工。使用下面的代码,在ObjectDataSource对象的Selecting事件中设置这些输入参数的值。

 

Protected Sub CategoriesDataSource_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ObjectDataSourceSelectingEventArgs) Handles CategoriesDataSource.Selecting
   
'Set parameter value through e.InputParameters
   e.InputParameters("departmentID").Value = 7
End Sub 

如果想得到更多的关于给ObjectDataSource控件设置参数的信息,请参考Programmatically Setting the ObjectDataSource's Parameter Values [VB]文章。

 

 

ObjectDataSource和SqlDataSource控件的执行后事件的练习

在指定处理执行完成后,SqlDataSourceObjectDataSource控件引发了相应的处理后事件Selected InsertedUpdated或者Deleted事件)。在处理后事件中,能够得到被影响的行数是否有异常出现。ObjectDataSource控件的处理后事件句柄传递了一个值到指定的处理方法中。例如数据库down掉了,输入了非法字符,动作违反了约束条件等异常出现了,或者其他的原因。再者,如果一个异常发生了,ExceptionHandled属性被设置成True,表明了异常被截获了。

 

如果想得到使用ObjectDataSource执行后事件中处理异常的信息,请参照Handling BLL- and DAL-Level Exceptions in an ASP.NET Page [VB]文章,如果你使用的是SqlDataSource控件,请参照Fredrik Normenblog中的Handle the Data Source Control Exception on Your Own文章。

 

结论

当使用SqlDataSourceObjectDataSource控件取得和修改数据的时候,执行前和后事件被引发。通过为那些事件创建的事件句柄,我们可以在这些事件处理函数中检查下面的工作流程,输出执行使用的参数,或者检查结果。处理前事件一般用作给数据控件初始化要在执行中用到的参数。执行后事件一般用来确定多少的记录被真正的处理了或者来确定是否这个操作引发了异常。在调试的过程中执行前和执行后事件都是非常有用的。


代码下载