浪潮集团副总裁王伟兴:ASP.NET 3.5核心编程学习笔记(19):数据源组件、SqlDataSource控件...

来源:百度文库 编辑:中财网 时间:2024/04/27 20:09:45

 数据源控件代表若干已命名的数据视图,每个视图能管理一个数据集合。该数据与数据源控件关联,通过SQL式的操作(Select、Insert、Delete和Count)进行管理,能够实现排序与分页。数据源控件有两种--表格式数据源和层次型数据源。下表对数据源控件做了简要说明:

  注意,SqlDataSource类并不只针对SQL Server,它还可以连接到任何能够管理关系型数据的ADO.NET提供程序。层次型数据源控件参见下表:

  注意,数据源控件不会被显示在页面上,它们之所以被实现为控件是为了“以声明方式存在”(在请求的处理过程中被实例化),作为aspx源代码的原始部分,以便能访问页面的视图状态。

数据源视图

  已命名视图由数据源视图对象表现,即DataSourceView类的实例。这些类代表自定义的数据视图,可设置排序、筛选和其他数据操作。DataSourceView类是与数据源控件相关联的所有视图类的基类。数据源控件中视图的数目取决于连接字符串以及底层数据源的特性与实现内容。在ASP.NET 2.0和更高版本中,内建的数据源只支持一个视图,即默认视图。下表列出了DataSourceView类的属性:

  DataSourceView类的主要方法见下表:

  所有数据源视图对象都能通过Select方法获取数据,该方法返回实现IEnumerable接口的对象。对象的实际类型取决于数据源控件的类型和属性(attribute)的设置。

与数据绑定控件的交互

  下图表现了ASP.NET 2.0和更高版本中数据源控件与数据绑定控件间的交互过程:

  大多数ASP.NET控件能充分感知数据源控件潜在的功能,通过IDataSource接口的方法连接到底层的数据仓库。官方只要求用作数据源的控件实现该接口,一旦控件获得数据源视图对象,控件便可调用其属性和方法来执行所需的任务。

层次型数据源的视图

  表格式数据源控件通常只有一个已命名视图,层次型数据源控件支持的视图可以为数据源中任何层面的数据。层次型数据源控件和表格式数据源控件针对数据绑定的编程接口的标准是一致的。但这两类控件的视图类不同,层次型数据源控件使用的视图类是HierarchicalDataSourceView,该类只有一个方法,即Select,该方法返回一个可枚举的层次型数据对象。

SqlDataSource控件

  该控件代表到关系型数据存储的连接,可以是SQL Server、Oracle、通过OLE DB或开放式数据库连接访问的数据源。

  我们可通过两个主要属性(ConnectionString表示连接字符串、ProviderName表示ADO.NET托管提供程序的命名空间)建立到数据存储的连接。ProviderName属性的默认值为System.Data.SqlClient,对于OLE DB提供程序,可使用System.Data.OleDb字符串。

  控件即可通过数据适配器获取,也可使用命令对象。获得的数据可能由DataSet容纳,也可由数据读取器读取。

  示例代码:

                 ProviderName='<%$ ConnectionStrings:LocalNWind.ProviderName %>' 
ConnectionString='<%$ ConnectionStrings:LocalNWind %>' SelectCommand="Select * From employees"                 UpdateCommand="Update employees Set lastname=@lname"                  DeleteCommand="Delete From employees Where http://www.360doc.com/mailto:employeeid=@TheEmp "                  FilterExpression="employeeid > 3">         

复制代码

  命令属性包含代表SQL命令的字符串,命令可包含参数。

  仅当DataSourceMode为DataSet时,筛选功能才会被启用。

  与SqlDataSource关联的视图类所支持的数据操作由相关的几组属性来提供,见下表:

  表中的许多属性会反映在实际的视图类属性上。

  SqlDataSource的Delete、Insert、Select、Update方法实质只是封装了底层数据源视图类的相应方法。与这些方法相对应还有相关事件,事件是成对出现的,如:Deleting/Deleted、Inserting/Inserted、Selecting/Selected、Updating/Updated,分别在上述方法被调用的前后引发。筛选操作通过Filtering事件发出通知。

声明式参数

  每种命令都有各自的参数集合,即ParameterCollection集合类的实例。下表列出了ASP.NET支持的几种参数类型:

  每种参数类都有Name属性和一组针对其作用和实现的属性。

  示例代码:

        ConnectionString='<%$ ConnectionStrings:LocalNWind %>'
SelectCommand="Select * From employees where employeeid > @MinID" >



复制代码

  该查询包含一个名为@MinID的占位符,该数据源控件会用ControlParameter对象返回的信息自动填充占位符。参数的值取决于给定控件的给定属性值,属性的名称由PropertyName指定,控件的ID由ControlId指定。上例中,EmpID控件的Text属性值被用作匹配参数@MinID的值。

冲突的检测

  在多用户使用同一页面的情况下,如果在当前记录被更改的同时,其他用户也要进行更改,更新/删除方法如何执行?

  SqlDataSource通过ConflictDetection属性来检查确定更新和删除操作时的行为,该属性被声明为ConflictOptions枚举类型,默认值为OverWriteChange。选择该值时,我们必须显式的为命令添加额外的子句,以检查该字段要被更改的值是否与最初读取的一致。

  示例:

Update employees Set firstname=@firstname
Where employeeid=@employeeid and firstname=@original_firstname
复制代码

  若使用CompareAllValues选项,我们需处理数据源控件的Deleted或Updated事件,检查受影响的行数。如果某操作没有影响任何记录,则可能发生的冲突。

  示例代码:

void OnUpdated(object sender, SqlDataSourceStatusEventArgs e)
{
//AffectRows表示没有行受到影响,可能是因为发生了冲突
if(e.AffectRows == 0)
{
......
}
}
复制代码

缓存

  为降低回发间执行查询的次数,我们可以使数据源控件在某个给定时间内缓存结果集。若数据被缓存,Select方法会从缓存中获取数据,而不通过底层数据库。若缓存过期,Select方法会生新从底获取数据,对缓存进行更新。SqlDataSource控件的缓存行为由下表中的属性控制:

 

  针对每种SelectCommand、ConnectionString、SelectParameters的不同组合,只创建一个缓存项。我们可通过数据源控件的CacheKeyDependecy属性控制缓存项。

AccessDataSource控件

  该控件与Access数据库连接,继承于SqlDataSource,提供了简单且更有针对性的编程接口。