通过 SqlDataSource 控件,可以使用 Web 服务器控件访问位于关系数据库中的数据。其中可以包括 Microsoft SQL Server 和 Oracle 数据库以及 OLE DB 和 ODBC 数据源。您可以将 SqlDataSource 控件与数据绑定控件(如 GridView、FormView 和 DetailsView 控件)一起使用,用极少代码或甚至不用代码来在 ASP.NET 网页上显示和操作数据。
一、背景
SqlDataSource 控件使用 ADO.NET 类与 ADO.NET 支持的任何数据库进行交互。这类数据库包括 Microsoft SQL Server(使用 System.Data.SqlClient 提供程序)、System.Data.OleDb、System.Data.Odbc 和 Oracle(使用 System.Data.OracleClient 提供程序)。使用 SqlDataSource 控件,可以在 ASP.NET 页中访问和操作数据,而无需直接使用 ADO.NET 类。只需提供用于连接到数据库的连接字符串,并定义使用数据的 SQL 语句或存储过程即可。在运行时,SqlDataSource 控件会自动打开数据库连接,执行 SQL 语句或存储过程,返回选定数据(如果有),然后关闭连接。
1.1、将 SqlDataSource 控件连接至数据源
配置 SqlDataSource 控件时,将 ProviderName 属性设置为数据库类型(默认为 System.Data.SqlClient)并将 ConnectionString 属性设置为连接字符串,该字符串包含连接至数据库所需的信息。连接字符串的内容根据数据源控件访问的数据库类型的不同而有所不同。例如,SqlDataSource 控件需要服务器名、数据库(目录)名,还需要如何在连接至 SQL Server 时对用户进行身份验证的相关信息。
如果不在设计时将连接字符串设置为 SqlDataSource 控件中的属性设置,则可以使用 connectionStrings 配置元素将这些字符串集中作为应用程序配置设置的一部分进行存储。这样,就可以独立于 ASP.NET 代码来管理连接字符串,包括使用 Protected Configuration 对这些字符串进行加密。下面的示例演示如何使用存储在名为 MyNorthwind 的 connectionStrings 配置元素中的连接字符串连接到 SQL Server Northwind 示例数据库。
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
runat="server"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
1.2、使用 SqlDataSource 控件发出数据命令
可为 SqlDataSource 命令指定四个命令(SQL 查询):SelectCommand、UpdateCommand、DeleteCommand 和 InsertCommand。每个命令都是数据源控件的一个单独的属性。对于每个命令属性而言,可以为要执行的数据源控件指定 SQL 语句。如果数据源控件与支持存储过程的数据库相连,则可以在 SQL 语句的位置指定存储过程的名称。
可以创建参数化的命令,这些命令包括要在运行时提供的值的占位符。下面的示例演示一个典型的参数化 SQL Select 命令:
Select CustomerID, CompanyName From Customers Where City = @city
可以创建参数对象,以指定命令在运行时获取参数值的位置,如从其他控件中、从查询字符串中等等。或者,可以通过编程方式指定参数值。
数据源控件在调用其对应的 Select、Update、Delete 或 Insert 方法时执行这些命令。当您调用绑定到数据源控件的页面或控件的 DataBind 方法时,将自动调用 Select 方法。如果希望数据源控件执行命令,还可以显式调用这四个方法中的任何一个。某些控件(如 GridView)可以自动调用这些方法,您无需调用这些方法或显式调用 DataBind 方法。
1.3、返回 DataSet 或 DataReader 对象
SqlDataSource 控件可以返回两种格式的数据:作为 DataSet 对象或作为 ADO.NET 数据读取器。通过设置数据源控件的 DataSourceMode 属性,可以指定要返回的格式。DataSet 对象包含服务器内存中的所有数据,并允许您在检索数据后采用各种方式操作数据。数据读取器提供可获取单个记录的只读光标。通常,如果要在检索数据后对数据进行筛选、排序、分页,或者要维护缓存,可以选择返回数据集。相反,如果只希望返回数据并且正在使用页面上的控件显示该数据,则可以使用数据读取器。例如,数据读取器适用于以下情形,即返回的数据要在 ListBox、DropDownList 或 GridView 控件中显示,在这些控件中,以只读格式显示一个结果的列表。
1.4、使用 SqlDataSource 控件进行缓存
SqlDataSource 控件可以缓存它已检索的数据,这样可以避免开销很大的查询操作,从而增强应用程序的性能。只要数据相对稳定,且缓存的结果小得足以避免占用过多的系统内存,就可以使用缓存。
默认情况下不启用缓存。将 EnableCaching 设置为 true,便可以启用缓存。缓存机制基于时间;您可以将 CacheDuration 属性设置为缓存数据的秒数。数据源控件为连接、选择命令、选择参数和缓存设置的每个组合维护一个单独的缓存项。
SqlDataSource 控件还可以利用 SQL Server 的缓存依赖项功能(如果您的 SQL Server 版本已提供)。使用此功能可以指定保留在缓存中的数据,这些数据一直保留到 SQL Server 在指定的表中报告更改为止。使用这种类型的缓存可以提高在 Web 应用程序中进行数据访问的性能,因为您可以最大限度地减少数据检索的次数,仅在必须获取刷新数据时执行检索。
1.5、使用 SqlDataSource 控件进行筛选
如果已为 SqlDataSource 控件启用缓存,并且已将数据集指定为 Select 查询返回的数据格式,则还可以筛选数据,而无需重新运行该查询。SqlDataSource 控件支持 FilterExpression 属性,可以使用该属性指定应用于由数据源控件维护的数据的选择条件。还可以创建特殊的 FilterParameters 对象,这些对象在运行时为筛选表达式提供值,从而对筛选表达式进行参数化。
1.6、使用 SqlDataSource 控件进行排序
SqlDataSource 控件支持在 DataSourceMode 设置为 DataSet 时响应绑定控件的排序请求。
二、SqlDataSource 类
SqlDataSource 数据源控件用于表示绑定到数据绑定控件的 SQL 关系数据库中的数据。将 SqlDataSource 控件与数据绑定控件一起使用,可以从关系数据库中检索数据,还可以在网页上显示、编辑和排序数据,而不必编写代码或只需编写少量代码。
若要连接到数据库,必须将 ConnectionString 属性设置为有效的连接字符串。SqlDataSource 可以支持能够使用 ADO.NET 提供程序(例如 SqlClient、OleDb、Odbc 或 OracleClient)连接到的任何 SQL 关系数据库。
若要从基础数据库中检索数据,请用 SQL 查询来设置 SelectCommand 属性。如果与 SqlDataSource 相关联的数据库支持存储过程,可以将 SelectCommand 属性设置为存储过程的名称。指定的 SQL 查询还可以是参数化的查询。可以将与参数化查询相关联的 Parameter 对象添加到 SelectParameters 集合中。
每当调用 Select 方法时,SqlDataSource 控件都会检索数据。此方法提供对 SelectMethod 属性所指定的方法的编程访问。当调用绑定到 SqlDataSource 的控件的 DataBind 方法时,这些控件会自动调用 Select 方法。如果设置数据绑定控件的 DataSourceID 属性,则该控件会根据需要自动绑定到数据源中的数据。建议通过设置 DataSourceID 属性将 ObjectDataSource 控件绑定到数据绑定控件。或者,也可以使用 DataSource 属性,但必须显式调用数据绑定控件的 DataBind 方法。以下是几个可使用 SqlDataSource 的数据绑定控件的示例:DataGrid、DetailsView、DataList 和 DropDownList。您可以随时以编程方式调用 Select 方法来从基础数据库中检索数据。
在声明性和编程 ASP.NET 方案中,可以将数据绑定控件的 DataSourceID 属性设置为 SqlDataSource 的 ID。还可以将 SqlDataSource 类的实例分配给数据绑定控件的 DataSource 属性。
您可以执行一些数据操作,例如更新、插入和删除,具体取决于基础数据库产品的功能以及 SqlDataSource 类的实例的配置。若要执行这些数据操作,请设置要执行的操作的相应命令文本以及所有相关参数。例如,对于更新操作,请将 UpdateCommand 属性设置为一个 SQL 字符串或一个存储过程的名称,并将所有必需的参数添加到 UpdateParameters 集合中。无论是由代码显式调用还是由数据绑定控件自动调用,调用 Update 方法时,都会执行更新操作。对于 Delete 和 Insert 操作也遵循这种常规模式。
在 SelectCommand、UpdateCommand、InsertCommand 和 DeleteCommand 属性中使用的 SQL 查询和命令可参数化。这意味着查询或命令可以使用占位符,而不必使用文本值,并且可以将占位符绑定到应用程序或用户定义的变量。您可以将 SQL 查询中的参数绑定到 Session 变量、通过 Web 窗体页的查询字符串传递的值以及其他服务器控件的属性值等。
默认情况下,SqlDataSource 控件与用于 SQL Server 的 .NET Framework 数据提供程序一起使用,但 SqlDataSource 不是特定于 Microsoft SQL Server 的。对于任何一个数据库产品,只要有适用的托管 ADO.NET 提供程序,您都可以将 SqlDataSource 控件与它连接。与 System.Data.OleDb 提供程序一起使用时,SqlDataSource 可以与任何符合 OLE DB 的数据库协同使用。与 System.Data.Odbc 提供程序一起使用时,SqlDataSource 可与任何 ODBC 驱动程序和数据库协同使用,其中包括 IBM DB2、MySQL 和 PostgreSQL。与 System.Data.OracleClient 提供程序一起使用时,SqlDataSource 可以与 Oracle 8.1.7 以及更高版本的数据库协同使用。允许使用的提供程序的列表记录在配置文件(Machine.config 或 Web.config 文件)的 DbProviderFactories 节中。
如果使用 SqlDataSource 在页上显示数据,可以使用数据源控件的数据缓存功能提高该页的性能。使用缓存可以减少数据库服务器上的处理量,但是要占用 Web 服务器上的内存;大多数情况下,这种代价是值得的。当 EnableCaching 属性设置为 true 且 CacheDuration 属性设置为某一秒数(该秒数是在放弃缓存项之前,缓存存储数据的时间)时,SqlDataSource 将自动缓存数据。您还可以指定 CacheExpirationPolicy 和可选的 SqlCacheDependency 值。
SqlDataSource 还提供其他功能,如下表所列。
功能 |
要求 |
缓存 |
将 DataSourceMode 属性设置为 DataSet 值,EnableCaching 属性设置为 true,并根据希望缓存数据所具有的缓存行为设置 CacheDuration 和 CacheExpirationPolicy 属性。 |
删除 |
将 DeleteCommand 属性设置为删除数据所用的 SQL 语句。此语句通常是参数化的。 |
筛选 |
将 DataSourceMode 属性设置为 DataSet 值。将 FilterExpression 属性设置为在调用 Select 方法时用于筛选数据的筛选表达式。 |
插入 |
将 InsertCommand 属性设置为插入数据所用的 SQL 语句。此语句通常是参数化的。 |
分页 |
SqlDataSource 当前不支持此功能,但是当您将 DataSourceMode 属性设置为 DataSet 值时,某些数据绑定控件(例如,GridView)支持分页。 |
选择 |
将 SelectCommand 属性设置为检索数据所用的 SQL 语句。 |
排序 |
将 DataSourceMode 属性设置为 DataSet。 |
更新 |
将 UpdateCommand 属性设置为更新数据所用的 SQL 语句。此语句通常是参数化的。 |
与所有数据源控件一样,SqlDataSource 控件与数据源视图类相关联。SqlDataSource 控件只有一个关联的 SqlDataSourceView,且其名称始终为 Table。
SqlDataSource 控件没有可视化呈现;将它实现为控件是为了能够以声明方式创建它,并且可以选择允许它参与状态管理。因此,SqlDataSource 不支持可视化功能,例如 EnableTheming 或 SkinID 属性提供的可视化功能。
示例:
2.1、代码示例演示如何使用声明性语法在 GridView 控件中显示 SQL Server 中的数据。
下面的代码示例演示如何以声明方式使用 SqlDataSource 控件从 SQL Server 中检索数据并将检索到的数据显示在 GridView 控件中。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
</asp:SqlDataSource>
margin: 0cm 0