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