数据源控件

数据源控件

ASP.NET 2.0新增了一种被称为数据源控件的控件。这些控件不但可以使用数据库(如SQL Server、Access、Oracle等)、XML文件或中间层业务对象作为数据源;而且还可以连接到数据源,并从其中检索和修改数据。数据源控件共包括5个控件:SqlDataSource、AccessDataSource、ObjectDataSource、SiteMapDataSource和XmlDataSource控件。其中,前3个控件使用平面数据源,后两个控件使用层次数据源。它们之间的继承关系如图5.4所示。

图5.4  数据源控件的继承关系图

5.2.1  访问SQL数据——SqlDataSource

SqlDataSource数据源控件可以使用Microsoft SQL Server、ODBC、OLE DB、Oracle等基于SQL关系的数据库作为数据源。使用Microsoft SQL Server数据库时,该控件还提供数据缓存功能。另外,该控件还支持对数据进行选择、插入、更新、修改、排序、分页、缓存等操作。SqlDataSource控件的常用属性及其说明如表5-5所示。

表5-5                                                    SqlDataSource控件的属性

属    性

描    述

DataSourceMode

获取数据的检索模式

ConnectionString

连接字符串

ProviderName

.NET Framework数据提供程序的名称

SelectCommand

检索数据的SQL字符串

SelectCommandType

指定SelectCommand属性的值是SQL语句或存储过程的名称

SelectParametersSelectCommand

SelectCommand属性使用的参数的集合

InsertCommand

插入数据的SQL字符串

InsertCommandType

指定InsertCommand属性的值是SQL语句或存储过程的名称

InsertParametersInsertCommand

InsertCommand属性使用的参数的集合

UpdateCommand

更新数据的SQL字符串

续表

属    性

描    述

UpdateCommandType

指定UpdateCommand属性的值是SQL语句或存储过程的名称

UpdateParametersUpdateCommand

UpdateCommand属性所使用的参数的集合

DeleteCommand

删除数据的SQL字符串

DeleteCommandType

指定DeleteCommand属性的值是SQL语句或存储过程的名称

DeleteParametersDeleteCommand

DeleteCommand属性使用的参数的集合

SqlDataSource控件分别为选择、插入、更新和删除操作提供了相应的方法,具体说明如表5-6所示。

表5-6                                                    SqlDataSource控件的方法

属    性

描    述

Select()

使用SelectCommand属性和SelectParameters属性中的参数选择数据

Insert()

使用InsertCommand属性和InsertParameters属性中的参数插入数据

Update()

使用UpdateCommand属性和UpdateParameters属性中的参数更新数据

Delete()

使用DeleteCommand属性和DeleteParameters属性中的参数删除数据

注意

通常情况下,Select()、Insert()、Update()和Delete()方法不需要手工显示调用。

ConnectionString属性指定SqlDataSource控件的连接数据源或者数据库的连接字符串;DataSourceMode属性指定选择或检索数据的模式。该控件还可以从数据源或者数据库中选择数据,或对数据源或者数据库进行插入、更新和删除等操作,具体描述如下。

     检索数据:SqlDataSource控件使用SelectCommand和SelectParameters属性来检索数据。其中,第一个属性指定检索数据的SQL语句或存储过程,第二个属性指定SQL语句或存储过程的参数集合。该控件调用Select()方法从数据源或者数据库中检索数据。

     插入数据:SqlDataSource控件使用InsertCommand和InsertParameters属性实现插入数据的功能。其中,第一个属性指定插入数据的SQL语句或存储过程,第二个属性指定SQL语句或存储过程的参数集合。该控件调用Insert()方法将数据插入到数据源或者数据库。

     更新数据:SqlDataSource控件使用UpdateCommand和UpdateParameters属性实现更新数据的功能。其中,第一个属性指定更新数据的SQL语句或存储过程,第二个属性指定SQL语句或存储过程的参数集合。该控件调用Update()方法更新数据源或者数据库中的数据。

     删除数据:SqlDataSource控件可以使用DeleteCommand和DeleteParameters属性实现删除数据的功能。其中,第一个属性指定删除数据的SQL语句或存储过程,第二个属性指定SQL语句或存储过程的参数集合。该控件调用Delete()方法从数据源或者数据库中的删除数据。

下面的代码实例声明了一个ListBox控件和一个SqlDataSource控件。SqlDataSource控件为ListBox控件的数据源控件,为其提供数据。

注意

myDSUser控件从配置文件Web.config中获取了连接字符串。获取的程序代码如下:

ConnectionString="<%$ ConnectionStrings:WEB2ASPNET2DBConnectionString %>"

<!-- Sample_05_02的SqlDataSoruceCtl.aspx页面 -->

<%@ Page Language="C#" %>

<script runat="server"></script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server"><title>访问SQL数据——SqlDataSource</title></head>

<body><form id="form1" runat="server">

<asp:ListBox ID="lbUser" runat="server" DataSourceID="myDSUser"

    DataTextField="UserName" DataValueField="ID" Rows="10"

    Width="200px"></asp:ListBox>

<asp:SqlDataSource ID="myDSUser" runat="server" ConnectionString="<%$

    ConnectionStrings:WEB2ASPNET2DBConnectionString %>"

    SelectCommand="SELECT [ID], [UserName], [Email], [CreateDate]

        FROM [User] WHERE ID > @ID">

    <SelectParameters>

        <asp:Parameter DefaultValue="10" Name="UserID" />

    </SelectParameters>

</asp:SqlDataSource>

</form></body>

</html>

在上述代码实例中,SqlDataSoruceCtl.aspx页面创建lbUser控件的数据源的操作步骤如下。

(1)选择lbUser控件,单击该控件的快捷菜单中的【显示智能标记】命令,如图5.5所示。

(2)单击【选择数据源】链接,弹出【数据源配置向导】对话框,如图5.6所示。

(3)在【选择数据源】下拉列表中选择【新建数据源】选项,弹出【数据源配置向导】对话框,如图5.7所示。在该对话框中,用户可以选择数据源的类型。在此,笔者选择了【数据库】类型,并设置数据源ID值为“myDSUser”。

 

      图5.5  显示lbUser控件的智能标记                图5.6  【数据源配置向导】对话框

(4)单击【确定】按钮,弹出【配置数据源 - myDSUser】对话框,如图5.8所示。在该对话框中,用户可以选择数据源的连接字符串。在此,笔者选择的数据源字符串为“WEB2ASPNET2DBConnectionString”。

(5)单击【下一步】按钮,弹出如图5.9所示对话框。在该对话框中,用户可以配置检索数据的Select语句。在此,笔者选择了用户表User,并检索了ID、UserName、E-mail和CreateDate 4个字段的数据。

  

           图5.7  选择数据源的类型                          图5.8  选择数据连接

(6)单击【下一步】按钮,弹出如图5.10所示对话框。在该对话框中,用户可以测试步骤(5)中配置的Select语句。在此,笔者单击【测试查询】按钮,网格中显示了检索结果。

  

             图5.9  配置Select语句                            图5.10  测试查询

(7)单击【完成】按钮,弹出【数据源配置向导】对话框,如图5.11所示。在该对话框中,用户可以选择数据源。在此,笔者选择了【myDSUser】数据源,并设置数据字段为“UserName”、值字段为“ID”。单击【确定】按钮,可以完成该数据源的配置过程。

(8)选择数据源控件myDSUser,并单击其【属性】面板中的【SelectQuery】中的【…】按钮,弹出【命令和参数编辑器】对话框,如图5.12所示。

 

              图5.11  选择数据源                     图5.12  【命令和参数编辑器】对话框

(9)单击【添加参数】按钮,参数列表中将增加一个新的参数。在此,笔者设置新参数的名称为“ID”,其默认值为10,同时设置SELECT命令为“SELECT [ID], [UserName], [Email], [CreateDate] FROM [User] WHERE ID > @ID”。如图5.13所示。执行SqlDataSoruceCtl.aspx页面中的代码,结果如图5.14所示。

     

            图5.13  添加新参数“ID”               图5.14  使用SqlDataSource控件访问SQL数据

5.2.2  访问Access数据源——AccessDataSource

AccessDataSource控件可以检索Microsoft Access数据库(文件后缀名为.mdb的文件)中的数据。同时,该控件也支持排序、筛选、分页等功能。AccessDataSource控件的属性如表5-7所示。

注意

AccessDataSource控件继承于SqlDataSource控件。

表5-7                                                  AccessDataSource控件的属性

属    性

描    述

ConnectionString

连接到数据库或数据源的连接字符串

DataFile

数据库或数据源的文件所在位置

ProviderName

处理Access数据库的.NET数据提供程序的名称

注意

不能显式指定AccessDataSource控件的ConnectionString和ProviderName属性的值。在配置该控件的数据源时,一般只要设置它的DataFile属性的值即可。特别地,系统为ProviderName属性提供的默认值为“Microsoft.Jet.OLEDB.4.0 OLE DB”。

下面的代码实例声明了一个ListBox控件和一个AccessDataSource数据源控件。该数据源控件为ListBox控件的数据源控件,其数据源为“databse”文件夹下的Northwind.mdb文件。

<!-- Sample_05_02的AccessDataSourceCtl.aspx页面 -->

<%@ Page Language="C#" %>

<script runat="server"></script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server"><title>访问Access数据源——AccessDataSource</title>

</head>

<body><form id="form1" runat="server">

<asp:ListBox ID="lbUser" runat="server" DataSourceID="myAccessDS"

    DataTextField="ProductName" DataValueField="ProductID" Rows="10"

    Width="200px"></asp:ListBox>

<asp:AccessDataSource ID="myAccessDS" runat="server"

    DataFile="~/database/Northwind.mdb"

    SelectCommand="SELECT [ProductID], [ProductName], [QuantityPerUnit],

        [Discontinued], [ReorderLevel], [UnitsOnOrder], [UnitPrice],

        [UnitsInStock] FROM [Products]">

</asp:AccessDataSource>

</form></body>

</html>

上述代码实例的执行结果如图5.15所示。

图5.15  AccessDataSource控件访问Access数据源

5.2.3  访问对象数据源——ObjectDataSource

ObjectDataSource控件可以使用自定义的业务对象、类或业务逻辑组件,它可以从这些对象、类或接口中检索数据。ObjectDataSource控件的功能非常强大,它提供了检索、更新、删除、插入、排序、过滤、分页、缓存等功能。ObjectDataSource控件的属性如表5-8所示。

表5-8                                                  ObjectDataSource控件的属性

属    性

描    述

SelectCountMethod

检索行数的方法或函数的名称

SelectMethod

检索数据的方法或函数的名称

SelectParametersSelectMethod

SelectMethod方法使用的参数

InsertMethod

插入数据的方法或函数的名称

InsertParametersInsertMethod

InsertMethod方法使用的参数

UpdateMethod

更新数据的方法或函数的名称

UpdateParametersUpdateMethod

UpdateMethod方法使用的参数

DeleteMethod

删除数据的方法或函数的名称

DeleteParametersDeleteMethod

DeleteMethod方法使用的参数

FilterExpressionSelectMethod

检索数据时的过滤数据的表达式

FilterParameters

与过滤表达式相关的参数集合

SortParameterNameSelectMethod

检索数据时的排序数据的表达式

MaximumRowsParameterName

用于指示要检索的数据源分页支持的记录数

StartRowIndexParameterName

分页时第一条记录的标识

DataObjectTypeName

用于更新、插入或删除数据操作中的参数类的名称

续表

属    性

描    述

TypeName

与对象数据源相关的类的名称

EnablePaging

控件是否启用分页

EnableCaching

控件是否启用数据缓存

ObjectDataSource控件对指定的业务对象(数据源)可以执行选择、更新、插入、删除等操作。其中,SelectMethod、UpdateMethod、InsertMethod、DeleteMethod属性分别指定这些操作所需要的方法SelectParameters、UpdateParameters、InsertParameters、DeleteParameters属性分别指定这些方法所需要的参数。

在下述代码实例中,笔者创建了两个类:UserInfo和Users。其中,UserInfo类封装了用户的基本属性:UserID、Username、Email和LoginDate,这些属性分别表示用户的ID、名称、电子邮件和登录时间。Users类定义操作用户的方法:GetUsers()、AddUser(UserInfo ui)、UpdateUser(int userID,UserInfo ui)和DeleteUser(UserInfo ui),这些方法分别用来执行检索、插入、更新和删除操作。Users类中的用户信息保存在泛型列表list中。

public class UserInfo

{

    private int userID;private string username;

    private string email;private DateTime loginDate;

    public int UserID

    {   ///属性UserID

        get{return userID;}set{userID = value;}

    }

    public string Username

    {   ///属性Username

        get{return username;}set{username = value;}

    }

    public string Email

    {   ///属性Email

        get{return email;}set{email = value;}

    }

    public DateTime LoginDate

    {   ///属性LoginDate

        get{return loginDate;}set{loginDate = value;}

    }

}

public class Users

{

    /// <summary>

    /// 保存用户信息的列表

    /// </summary>

    private List<UserInfo> list;

    public Users()

    {   ///初始化列表,并添加10条数据

        list = new List<UserInfo>();

        for(int i = 0; i < 10; i++)

        {   ///构造用户信息

            UserInfo ui = new UserInfo();

            ui.UserID = i;

            ui.Username = "MyName #" + (i + 1).ToString();

            ui.Email = ui.Username + "@web.com";

            ui.LoginDate = DateTime.Now;

            list.Add(ui);

        }

    }

    /// <summary>

    /// 获取所有用户信息

    /// </summary>

    public List<UserInfo> GetUsers() { return list; }

    /// <summary>

    /// 增加一个用户信息

    /// </summary>

    public void AddUser(UserInfo ui) { list.Add(ui); }

    /// <summary>

    /// 更新一个用户信息

    /// </summary>

    public void UpdateUser(int userID,UserInfo ui) { list[userID] = ui; }

    /// <summary>

    /// 删除一个用户信息

    /// </summary>

    public void DeleteUser(UserInfo ui) { list.Remove(ui); }

}

下面的代码实例声明了一个ListBox控件和一个ObjectDataSource数据源控件。该数据源控件为ListBox控件的数据源控件,它的数据源为上述代码实例中定义的Users类。

<!-- Sample_05_02的ObjectDataSourceCtl.aspx页面 -->

<%@ Page Language="C#" %>

<script runat="server"></script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server"><title>访问对象数据源——ObjectDataSource</title>

</head>

<body><form id="form1" runat="server">

<asp:ListBox ID="lbUser" runat="server" DataSourceID="myObjectDS"

    DataTextField="Username" DataValueField="UserID" Rows="10"

    Width="200px"></asp:ListBox>

<asp:ObjectDataSource ID="myObjectDS" runat="server"

    DataObjectTypeName="UserInfo" DeleteMethod="DeleteUser"

    InsertMethod="AddUser" SelectMethod="GetUsers" TypeName="Users"

    UpdateMethod="UpdateUser">

    <UpdateParameters>

        <asp:Parameter Name="userID" Type="Int32" />

        <asp:Parameter Name="ui" Type="Object" />

    </UpdateParameters>

</asp:ObjectDataSource>

</form></body>

</html>

上述代码实例的执行结果如图5.16所示。

图5.16  ObjectDataSource控件访问对象数据源Users

5.2.4  访问XML数据源——XmlDataSource

XmlDataSource控件使用层次结构(如XML文件等)的数据源,它的数据源往往是一个XML文件。

注意

XmlDataSource控件特别适用于分层的服务器控件,如TreeView、Menu等控件。

XmlDataSource控件提供了两种显示数据的方式:分层显示和表格显示。它提供了检索、更新、插入、删除、缓存等功能,其中,更新、插入、删除操作需要Save()方法支持。其最常用的方法是用于显示分层数据,且不能修改被显示的数据。XmlDataSource控件的属性如表5-9所示。

表5-9                                                   XmlDataSource控件的属性

属    性

描    述

Data

绑定控件的XML块

DataFile

绑定控件的XML文件的文件名

Transform

定义XSLT转换的可扩展样式表语言(XSL)块

TransformFile

定义XSLT转换的可扩展样式表语言(XSL)文件的名称

XPath

XPath查询表达式,用于检索指定的XML数据

TransformArgumentList

XSLT参数的列表

CacheDuration

缓存持续的时间,单位为s

CacheExpirationPolicy

缓存过期行为

CacheKeyDependency

缓存的键依赖项

EnableCaching

控件是否启用数据缓存

DataFile属性指定XmlDataSource控件的数据源(往往是一个XML文件),该控件将从该XML文件中加载数据。另外,该控件还可以直接使用Data属性指定的XML数据作为数据源。当XmlDataSource控件从其数据源中加载数据时,还可以使用Transform和TransformFile属性指定的XSLT格式来转换加载数据的显示格式。

下面的代码实例创建了一个名称为User.xml的XML文件(保存在文件夹“files”下)。该文件定义了Users、User等元素。其中,User元素指定一个用户的基本属性,如ID、UserName、Email、CreateDate等。

<?xml version="1.0" ?>

<Users>

    <User>

        <ID>1</ID>

        <Username>admin</Username>

        <Email>[email protected]</Email>

        <CreateDate>2006-11-16T22:15:00</CreateDate>

    </User>

    <User>

        <ID>2</ID>

        <Username>zydchina</Username>

        <Email>[email protected]</Email>

        <CreateDate>2006-11-17T22:18:46.670</CreateDate>

    </User>

    <User>

        <ID>3</ID>

        <Username>dorient</Username>

        <Email>[email protected]</Email>

        <CreateDate>2006-11-16T22:15:00</CreateDate>

    </User>

    <User>

        <ID>4</ID>

        <Username>23424</Username>

        <Email>[email protected]</Email>

        <CreateDate>2006-12-16T17:27:05.827</CreateDate>

    </User>

    <User>

        <ID>5</ID>

        <Username>2222222</Username>

        <Email>[email protected]</Email>

        <CreateDate>2006-12-16T17:27:05.827</CreateDate>

    </User>

</Users>

下面的代码实例声明了一个XmlDataSource控件和一个TreeView控件(以树型结构显示数据),同时,把XmlDataSource控件作为TreeView控件的数据源控件。其中,XmlDataSource控件的数据源为上述代码实例定义的User.xml文件。

<!-- Sample_05_02的XmlDataSourceCtl.aspx页面 -->

<%@ Page Language="C#" %>

<script runat="server"></script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server"><title>访问XML数据源——XmlDataSource</title></head>

<body><form id="form1" runat="server">

<asp:TreeView ID="tvUser" runat="server" DataSourceID="myXmlUser"

    ImageSet="BulletedList" ShowExpandCollapse="False">

    <ParentNodeStyle Font-Bold="False" />

    <HoverNodeStyle Font-Underline="True" ForeColor="#5555DD" />

    <SelectedNodeStyle Font-Underline="True" ForeColor="#5555DD"

        HorizontalPadding="0px" VerticalPadding="0px" />

    <NodeStyle Font-Names="Verdana" Font-Size="8pt" ForeColor="Black"

        HorizontalPadding="0px" NodeSpacing="0px" VerticalPadding="0px" />

</asp:TreeView>

<asp:XmlDataSource ID="myXmlUser" runat="server"

    DataFile="~/files/User.xml" XPath="/Users/User">

</asp:XmlDataSource>

</form></body>

</html>

上述代码实例的执行结果如图5.17所示。

图5.17  XmlDataSource控件访问XML数据源

5.2.5  访问站点地图数据源——SiteMapDataSource

SiteMapDataSource控件使用站点地图(后缀名为.sitemap的文件,该文件也是一个XML格式的文件)文件作为数据源。它能够从站点地图提供程序中检索导航数据,然后将数据传递给可显示该数据的控件。SiteMapDataSource控件的属性如表5-10所示。

表5-10                                               SiteMapDataSource控件的属性

属    性

描    述

ShowStartingNode

是否检索并显示起始节点

StartingNodeUrl

指定起始节点的路径。若该文件被检索数据,将该节点作为参照节点

StartingNodeOffset

起始节点的偏移量

StartFromCurrentNode

是否从当前节点开始检索

SiteMapProvider

站点地图提供程序的名称

Provider

与数据源控件关联的SiteMapProvider对象

ContainsListCollection

数据源控件是否包含数据源视图对象的集合

站点地图文件的名称为Web.sitemap。它是一个XML格式的文件,且包含siteMap和siteMapNode元素。下面的代码实例就是应用程序Sample_05_02的站点地图文件Web.sitemap的内容。

<?xml version="1.0" encoding="utf-8"?>

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">

    <siteMapNode url="SitemapDataSourceCtl.aspx"

        title="SitemapDataSourceCtl.aspx页面" description="页面">

        <siteMapNode url="files/User.xml" title="User.xml文件"

            description="文件" />

        <siteMapNode url="database/Northwind.mdb"

            title="Northwind数据库" description="数据库" />

        <siteMapNode url="App_Code/User.cs" title="User.cs文件"

            description="类文件" />

    </siteMapNode>

</siteMap>

在站点地图文件中,每一个siteMapNode元素都表示一个SiteMapNode对象。该对象提供了描述导航数据的属性,如Description、Title、Url、ParentNode等属性。SiteMapNode对象的属性说明如表5-11所示。

表5-11                                                    SiteMapNode对象的属性

属    性

描    述

 

Description

节点的描述

 

Title

节点的标题

 

Url

节点所代表的页的URL

 

ChildNodes

节点的所有子节点集合

 

HasChildNodes

当前节点是否包含子节点

 

ParentNode

当前节点的父节点

 

RootNode

当前节点的根节点

 

 

注意

SiteMapDataSource控件的默认数据源为它所在应用程序的站点地图文件Web.sitemap。在默认情况下,该控件从站点地图文件Web.sitemap的根节点开始检索数据。SiteMapDataSource控件专门用于显示导航数据,它不支持排序、筛选、分页、缓存、更新、插入、删除等操作。

下面的代码实例声明了一个SiteMapDataSource控件和一个TreeView控件(以树型结构显示数据),同时,把SiteMapDataSource控件设置为TreeView控件的数据源控件。其中,SiteMapDataSource控件的数据源为应用程序Sample_05_02的站点地图文件Web.sitemap。

<!-- Sample_05_02的SitemapDataSourceCtl.aspx页面 -->

<%@ Page Language="C#" %>

<script runat="server"></script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server"><title>访问站点地图数据源——SiteMapDataSource</title>

</head>

<body><form id="form1" runat="server">

<asp:SiteMapPath ID="smpWeb" runat="server" Font-Names="Verdana"

    Font-Size="0.8em" PathSeparator=" : ">

    <PathSeparatorStyle Font-Bold="True" ForeColor="#990000" />

    <CurrentNodeStyle ForeColor="#333333" />

    <NodeStyle Font-Bold="True" ForeColor="#990000" />

    <RootNodeStyle Font-Bold="True" ForeColor="#FF8000" />

</asp:SiteMapPath>

</form></body>

</html>

上述代码实例的执行结果如图5.18所示。

图5.18  SiteMapDataSource控件访问站点地图数据源

你可能感兴趣的:(数据源)