8.5 数据源控件
数据源控件是一个为了与数据绑定控件交互而设计的服务器控件,它隐藏了人工数据绑定的复杂性。数据源控件不仅为控件提供数据,而且还支持数据绑定控件执行常见的数据操作。数据源控件不呈现任何用户界面,充当了特定数据源(如数据库、业务对象或XML文件)与网页上的其他数据绑定控件之间的桥梁。数据源控件实现了丰富的数据检索和修改功能,其中包括查询、排序、分页、筛选、更新、删除以及插入。
ASP.NET 4.5中包含支持不同数据绑定方案的数据源控件,这些控件可以使用不同的数据源。此外,数据源控件模型是可扩展的,因此用户还可以创建自己的数据源控件或者为现有的数据源提供附加功能,从而实现与不同数据源的交互。
数据源控件主要可以用来执行以下两种任务:
● 让数据绑定控件从数据源控件中获取数据,并把数据填充到要显示的控件中。在这种情况下,数据的获取或绑定都是自动完成的,并不需要调用方法DataBind来完成绑定。
● 利用数据源控件更新数据源。此时,数据源控件需要同复杂数据绑定控件(诸如GridView或DetailsView这类控件)一起使用。
ASP.NET 4.5的内置数据源控件有以下数种:
● ObjectDataSource,用于向数据绑定控件表示数据识别中间层对象或数据接口对象。它允许绑定到一个返回数据的自定义业务对象或数据访问对象,可以在N层结构中存取中间层的数据。
● SqlDataSource,用来访问在关系型数据源,这些数据源包括Microsoft SQL Server和OLE DB以及ODBC数据源。它与SQL Server一起使用时支持高级缓存功能。当数据作为DataSet对象返回时,此控件还支持排序、筛选和分页。
● EntityDataSource,该控件支持基于实体数据模型(EDM)的数据绑定方案。此数据规范将数据表示为实体和关系集。它支持自动生成更新、插入、删除和选择命令以及排序、筛选和分页。
● LinqDataSource,通过该控件,可以在ASP.NET网页中使用LINQ,从数据表或内存数据集合中检索数据。使用声明性标记,可以对数据进行检索、筛选、排序和分组操作。从SQL Server数据库表中检索数据时,也可以配置LinqDataSource控件来处理更新、插入和删除操作。
● XmlDataSource,它主要用来访问XML文件,特别适用于分层的服务器控件,如TreeView或Menu控件。它支持使用XPath表达式来实现筛选功能,并允许对数据应用XSLT转换。它允许通过保存更改后的整个XML文档来更新数据。
● SiteMapDataSource,该控件结合页面站点导航使用,为常用的导航控件提供数据源。
以上这些控件的使用方法大同小异,其中,SqlDataSource控件和ObjectDataSource是最常用的数据源控件,所以本节以这两个控件为例介绍数据源控件的相关内容,另外的几个数据源控件会在本书其他的章节中进行有选择的介绍。
8.5.1 SqlDataSource控件
SqlDataSource是ASP.NET中最为常用的数据源控件,通过该控件,可以使Web控件访问位于某个关系数据库中的数据,该数据库包括Microsoft SQL Server和Oracle数据库,以及OLE DB和ODBC数据源。可以将SqlDataSource控件和用于显示数据的服务器控件(如GridView、FormView和DetailsView控件)结合使用,使用很少的代码或不使用代码就可以在ASP.NET网页中显示和操作数据。
在ASP.NET页面文件中,SqlDataSource控件定义的标记同其他控件一样,代码如下:
1.SqlDataSource控件的属性
SqlDataSource控件提供了如表8-1所示的属性。
表8-1 SqlDataSource控件的属性
(续表)
按照SqlDataSource控件可以实现的功能,把其属性分为以下几类:
(1)执行数据库操作命令
SelectCommand、UpdateCommand、DeleteCommand和InsertCommand 4个属性对应数据库操作的4个命令:选择、更新、删除和插入,只需要把对应的SQL语句赋予这4个属性,SqlDataSource控件即可完成对数据库的操作。
可以把带参数的SQL语句赋予这4个属性,例如:
以上代码中就是把代码参数的SQL语句赋予UpdateCommand属性。其中@新闻标题、@内容、@类别和@新闻编号为SQL语句的参数。
SQL语句的参数值可以从其他控件、查询字符串中获得,也可以通过编程方式指定参数值。参数的设置则是由属性InsertParameters、SelectParameters、UpdateParameters和DeleteParameters来进行。
(2)返回DataSet或DataReader对象
SqlDataSource控件可以返回两种格式的数据:作为DataSet对象或作为ADO.NET数据读取器。通过设置数据源控件的DataSourceMode属性,可以指定要返回的格式。
(3)进行缓存
默认情况下不启用缓存。将EnableCaching属性设置为true,便可以启用缓存。
(4)进行检索
如果要使用SqlDataSource控件从数据库中检索数据,需要设置以下属性:
● ProviderName,设置为ADO.NET提供程序的名称,该提供程序表示正在使用的数据库。
● ConnectionString,设置为用于数据库的连接字符串。
● SelectCommand,设置为从数据库中返回数据的SQL查询或存储过程。
2.SqlDataSource控件的应用
前面提到SqlDataSource控件和用于显示数据的控件(如GridView、FormView和DetailsView控件)结合使用,能够用很少的代码或不编写代码就可以在ASP.NET网页中显示和操作数据。
【实例8-10】SqlDataSource控件的使用
本实例分别使用两个SqlDataSource数据源控件、一个DataGrid控件和一个DropDownList控件进行数据绑定,实现用户选择下拉列表中的新闻标题,在列表控件上显示新闻信息。在本例中将不写一行的代码,全部使用可视化图形的操作设置各种控件的属性,体验一下SqlDataSource数据源控件的强大功能。
01 启动Visual Studio 2012,创建一个ASP.NET Web空应用程序,命名为“实例8-10”。
02 在“实例8-10”中创建一个名为Default.aspx的窗体。
03 单击网站目录下的Default.aspx文件,进入“视图编辑”界面,打开“设计视图”,从工具箱中拖动一个DropDownList、一个DataGrid控件和两个SqlDataSource数据源控件。
04 将鼠标移到DataGrid控件上,其上方会出现一个向右的黑色小三角。单击它,弹出DataGrid任务列表,如图8-9所示。在“选择数据源”下拉列表中选中SqlDataSource1。
图8-9 DataGrid任务列表
05 将鼠标移到SqlDataSource1控件上,其上方会出现一个向右的黑色小三角,单击它,弹出SqlDataSource任务列表,如图8-10所示。
图8-10 SqlDataSource1任务列表
06 选择“配置数据源”选项,弹出如图8-11所示的“配置数据库”对话框。
图8-11 “选择你的数据连接”对话框
07 单击“新建连接”按钮,进入如图8-12所示的“添加连接”对话框。
图8-12 “添加连接”对话框
08 在“数据源”文本框中输入Microsoft SQL Server(SqlClient),在“服务器名”下拉列表中选择自己SQL Server服务器的名称,选择“选择或输入数据库名称”单选按钮,在其下的下拉列表中选中db_news数据库的名称,最后单击“确定”按钮,返回如图8-13所示的“选择数据连接”对话框。
图8-13 “选择您的数据连接”对话框
09 此时,在“应用程序连接数据库应使用哪个数据连接”下列列表中自动显示出刚才添加的连接名称,单击“下一步”按钮,进入如图8-14所示的“将连接字符串保存到应用程序配置文件中”对话框。
图8-14 “将连接字符串保存到应用程序配置文件中”对话框
10 选中“是,将此连接另存为:”多选框,单击“下一步”按钮,进入如图8-15所示的“配置Select语句”对话框。
图8-15 “配置Select语句”对话框
11 单击WHERE按钮,弹出如图8-16所示的“添加WHERE子句”对话框。
图8-16 “添加where子句”对话框
12 在“列”下拉列表中选择Title数据字段。在“源”下拉列表中选择Control选项,表示从页面控件中获取查询数据。在“参数属性”选项组中的“控件ID”下拉列表中选择ID为DropDownList1的下拉列表控件。然后单击“添加”按钮,最后单击“确定”按钮,回到图8-13所示“配置数据源”对话框。单击“下一步”按钮。进入如图8-17所示的“测试查询”对话框。
图8-17 “测试查询”对话框
13 单击“完成”按钮,结束SqlDataSource1控件的数据源配置。
14 将鼠标移到DropDownList控件上,其上方会出现一个向右的黑色小三角,单击它,弹出DropDownList任务列表,如图8-18所示。
图8-18 DropDownList任务列表
15 选中“启用AutoPostBack”选项,单击“选择数据源”选项,弹出如图8-19所示的“数据源配置向导”对话框。
图8-19 “数据源配置向导”对话框
16 在“选择数据源”下拉列表中选中SqlDataSource2的控件ID;在“选择要在DropDownList中显示的数据字段”的文本框中输入数据表tb_News的字段Title;在“为DropDownList的值选择数据字段”的文本框中同样输入Title;最后单击“确定”按钮。
17 接着配置开始SqlDataSource2控件数据源。配置过程和SqlDataSource1控件大致相同,区别仅在于在于查询语句设置不同。当配置过程进入如图8-20所示的“配置Select语句”对话框时,直接单击“下一步”按钮即可,因为这里在SQL查询时不需要使用Where子句。其他的配置步骤完全相同,这里不再重复。
图8-20 “配置Select语句”对话框
18 现在就可以按快捷键Ctrl+F5运行程序,运行效果如图8-21所示。
图8-21 运行效果1
19 当用户选择不同的下拉列表选项,列表控件显示如图8-22所示的不同信息。
图8-22 运行效果
8.5.2 ObjectDataSource数据源控件
ObjectDataSource数据源控件用于向数据绑定控件表示数据识别中间层对象或数据接口对象。可以结合使用ObjectDataSource数据源控件与数据绑定控件在ASP.NET页面上显示数据,只要用少量代码或不用代码就可以在网页上显示、编辑和排序数据。
一种常见的应用程序设计做法是将表示层与业务逻辑层分开,将业务逻辑层装到业务对象中,这些业务对象在表示层和数据层之间构成一个独特的层,从而得到一个三层应用程序结构。大多数ASP.NET数据源控件,如SqlDataSource,都在两层应用程序层次结构中使用。在该层次结构中,表示层(ASP.NET网页)可以与数据层(数据库和XML文件等)直接进行通信,而ObjectDataSource数据源控件使开发人员能够在保留它们的三层应用程序结构的同时,使用ASP.NET数据源控件。
ObjectDataSource数据源控件可充当对象的代理。通过配置ObjectDataSource控件可以指定底层的对象,以及指定这些对象的方法如何映射到ObjectDataSource控件的Select、Insert、Upadte和Delete方法。当底层的对象被指定并且其方法映射到ObjectDataSource控件的方法后,就可以把ObjectDataSource数据源控件绑定到页面的Web服务器数据控件。ASP.NET提供了许多Web服务器数据控件,包括GridView控件、DetailsView控件、RadioButtonList控件、DropDownList控件等。在页面的生命周期中,Data Web服务器控件可能需要访问它所绑定的数据,这将通过调用ObjectDataSource数据源控件的Select方法来实现。如果这个Web服务器数据控件还支持插入、更新或者删除操作,那么它将调用ObjectDataSource数据源控件的Insert、Update或者Delete方法。这些调用会通过ObjectDataSource数据源控件被发送到适当的底层对象的方法中。
由于ObjectDataSource数据源控件能应用于三层应用程序的架构中,而其他数据源只能应用于两层架构应用程序,因此ObjectDataSource数据源控件有很多不同于其他数据源控件的属性,如表8-2所示。
表8-2 ObjectDataSource数据源控件属性
(续表)
ObjectDataSource数据源控件如果要从业务对象中检索数据,只需设置检索数据方法的SelectMethod属性。如果此方法没有返回IEnumerable或DataSet对象,则运行时在Ienumerable集合中包装该对象。如果此方法签名带参数,则可以将Parameter对象添加到SelectParameters集合中,然后将它们绑定到要传递的由SelectMethod属性指定的方法的值。
根据ObjectDataSource数据源控件使用的业务对象的功能可以执行诸如更新、插入和删除的数据操作。如果要执行这些数据操作,则只需为要执行的操作设置适当的方法名称和所需关联的任何参数。例如更新操作,将UpdateMethod属性设置为业务对象方法的名称,该方法执行更新并将所需的任何参数添加到UpdateParameters集合中。如果ObjectDataSource数据源控件与数据绑定控件相关联,则由数据绑定控件添加参数。在这种情况下,需要确保方法的参数名称和数据绑定控件中的字段名称相匹配。在调用Update方法时,由代码显示执行更新或由数据绑定控件自动执行更新。Delete和Insert方法的操作遵循相同的常规模式。可以假定业务对象以逐个记录的方式执行这些类型的数据操作。
【实例8-11】ObjectDataSource数据源控件的使用
本实例演示如何使用ObjectDataSource控件和自定义中间层业务对象来连接数据库db_news,并显示该数据库tb_News表中Title字段的全部记录,具体实现步骤如下:
01 启动Visual Studio 2012,创建一个ASP.NET Web空应用程序,命名为“实例8-11”。
02 在“实例8-11”中创建一个名为Default.aspx的窗体。
03 用右键单击程序名,在弹出的如图8-23所示的快捷菜单中选择“添加”|“新建文件夹”命令。在解决方案程序根目录下会生成一个新的文件夹,将其命名为App_Code,如图8-24所示。
图8-23 快捷菜单
图8-24 生成文件夹
04 用右键单击App_Code文件夹,在弹出如图8-23所示的快捷菜单中选择“添加”|“新建项”命令,弹出如图8-25所示的“添加新项”文本框。
图8-25 “添加新项”对话框
05 选择Web模板中的“类”模板,命名为manage.cs,从而创建一个名为manage的类文件。
06 双击创建完毕的manage.cs,在代码文件中输入以下关键代码:
上面的代码中,第1行到最后一行定义了一个manage类,其中,在第3行的构造函数中保存了数据库连接字符串;第6行~第14行定义了获得数据表中数据的方法GetName,返回的是一个保存查询出来数据的DataTable对象。
07 保存manage.cs,如果不保存,下面的步骤将得不到这个类和其中方法的引用。
08 单击网站的目录下的Default.aspx文件,进入“视图编辑”界面,打开“设计视图”,从工具箱中拖动一个ListBox控件和一个ObjectDataSource控件到编辑区。
09 将鼠标移到ObjectDataSource控件上,其右上方会出现一个向右的小三角,单击它,弹出“ObjectDataSource任务”列表,如图8-26所示。
图8-26 “ObjectDataSource任务”列表
10 选择列表中的“配置数据源”命令,弹出如图8-27所示的“配置数据源”对话框。
图8-27 “配置数据源”对话框
11 在“选择业务对象”下拉列表中选择.manage选项,也就是在代码文件中定义的manage类。单击“下一步”按钮,进入如图8-28所示的“定义数据方法”对话框。
图8-28 “定义数据方法”对话框
12 切换到SELECT选项卡,在“选择方法”下拉列表框中选择GetName方法,单击“完成”按钮,结束配置数据源。
13 进入Default.aspx文件的“视图编辑”界面,将鼠标移到ListBox控件上,其右上方会出现一个向右的小三角,单击它,弹出“ListBox任务”列表。
14 单击其中的“选择数据源”命令,在弹出如图8-29所示的“数据源配置向导”对话框。在“选择数据源”下拉列表中选择ObjectDataSource1选项,在“选择要在ListBox中显示的数据字段”下拉列表中选择Title选项,在“为ListBox的值选择数据字段”下拉列表框中选择Title选项,最后,单击“确定”按钮。
图8-29 “数据源配置向导”对话框
15 按快捷键Ctrl+F5,运行程序得到的效果和前文的“实例8-8”的运行结果完全相同。