服务器端数据访问
服务器端数据介绍
数据访问是任何实际应用程序的核心部分,而 ASP.NET 提供了一套丰富的控件,这些控件与公共语言运行库中提供的托管数据访问 API 很好地集成在一起。 本节多次演练同一个示例,该示例使用 ASP.NET DataGrid 控件绑定到 SQL 查询的结果和 XML 数据文件。 本节假定您熟悉数据库基础知识和 SQL 查询语言。
服务器端数据访问很独特,因为 Web 页基本上是无状态的。当试图执行事务时,如插入或更新从数据库检索的数据集中的记录时,这向我们提出了某些困难的挑战。 正如将在本节中看到的,DataGrid 控件可以帮助应付这些挑战,使您得以更多地集中在应用程序逻辑上,对状态管理和事件处理的具体细节则不用考虑太多。
连接、命令和数据集
公共语言运行库为数据密集的应用程序开发提供了完整的托管数据访问 API 集。 这些 API 帮助抽象数据并用一致的方法表示数据,与实际的数据源(SQL Server、OLEDB、XML 等)无关。 最常使用的对象基本上有三种:连接、命令和数据集。
连接表示与某些数据存储区(如 SQL Server 或 XML 文件)的物理连接。
命令表示从数据存储区检索(选择)或对数据存储区进行操作(插入、更新、删除)的指令。
数据集表示应用程序使用的实际数据。 注意,数据集总是同它们的源连接和数据模型断开并可独立修改。 不过,数据集的更改可以很容易与起始数据模型相协调。
有关公共语言运行库中托管数据访问解决方案的更详细演练,请阅读本教程的 ADO.NET 概述一节。
访问基于 SQL 的数据
应用程序一般需要对 SQL 数据库执行一个或多个选择、插入、更新或删除查询。 下表显示上述每个查询的示例。
查询
示例
简单选择
SELECT * from Employees WHERE FirstName = 'Bradley';
联接选择
SELECT * from Employees E, Managers M WHERE E.FirstName = M.FirstName;
插入
INSERT into Employees VALUES ('123-45-6789','Bradley','Millington','Program Manager');
更新
UPDATE Employees SET Title = 'Development Lead' WHERE FirstName = 'Bradley';
删除
DELETE from Employees WHERE Productivity < 10;
为了使页能够访问执行 SQL 数据访问所需的类,必须将 System.Data 和 System.Data.SqlClient 命名空间导入到页中。
<%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %>
若要对 SQL 数据库执行选择查询,请创建与数据库的 SqlConnection,传递连接字符串,然后构造包含查询语句的 SqlDataAdapter 对象。 若要用查询结果填充 DataSet 对象,请调用命令的 Fill 方法。
SqlConnection myConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes"); SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection); DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors"); Dim myConnection As New SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes") Dim myCommand As New SqlDataAdapter("select * from Authors", myConnection) Dim ds As New DataSet() myCommand.Fill(ds, "Authors") var myConnection:SqlConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes"); var myCommand:SqlDataAdapter = new SqlDataAdapter("select * from Authors", myConnection); var ds:DataSet = new DataSet(); myCommand.Fill(ds, "Authors");
正如本节前面所提到的,使用数据集的好处是它为您提供了断开连接的数据库视图。 可以在应用程序中操作数据集,然后在以后协调更改和实际的数据库。 对于长期运行的应用程序,这通常是最好的方法。 对于 Web 应用程序,通常对每个请求执行短操作(一般只是显示数据)。 通常不需要在一系列请求间保持 DataSet 对象。 对于这类情况,可以使用 SqlDataReader。
SqlDataReader 对从 SQL 数据库检索的数据提供仅向前的只读指针。 因为 SqlDataReader 使用表格数据流 (TDS) 直接从数据库连接读取数据,因此它如果可以用于方案,其执行效率会比 DataSet 高。
若要使用 SqlDataReader,请声明 SqlCommand 而不是 SqlDataAdapter。 SqlCommand 公开返回 SqlDataReader 的 ExecuteReader 方法。 还请注意,当使用 SqlCommand 时,必须显式打开和关闭 SqlConnection。 调用 ExecuteReader 后,SqlDataReader 可以绑定到 ASP.NET 服务器控件,正如将在下一节看到的。
<Tab Name="C#">
SqlConnection myConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes"); SqlCommand myCommand = new SqlCommand("select * from Authors", myConnection);
myConnection.Open();
SqlDataReader dr = myCommand.ExecuteReader();
...
myConnection.Close();
</Tab>
<Tab Name="VB">
Dim myConnection As SqlConnection = New SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes") Dim myCommand As SqlCommand = New SqlCommand("select * from Authors", myConnection)
myConnection.Open()
Dim dr As SqlDataReader = myCommand.ExecuteReader()
...
myConnection.Close()
</Tab>
<Tab Name="Js cript">
var myConnection:SqlConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes"); var myCommand:SqlCommand = new SqlCommand("select * from Authors", myConnection);
myConnection.Open();
var dr : SqlDataReader; dr = myCommand.ExecuteReader();
...
myConnection.Close();
</Tab>
当执行不要求返回数据的命令(如插入、更新和删除)时,也使用 SqlCommand。 该命令通过调用 ExecuteNonQuery 方法发出,而此方法返回受影响的行数。 注意当使用 SqlCommand 时,必须显式打开连接;SqlDataAdapter 自动为您处理如何打开连接。
<Tab Name="C#"> SqlConnection myConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes"); SqlCommand myCommand = new SqlCommand( "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'", myConnection);
myCommand.Connection.Open(); myCommand.ExecuteNonQuery(); myCommand.Connection.Close();
</Tab>
<Tab Name="VB"> Dim myConnection As New SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes") Dim myCommand As New SqlCommand( _ "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'", _ myConnection)
myCommand.Connection.Open() myCommand.ExecuteNonQuery() myCommand.Connection.Close()
</Tab>
<Tab Name="Js cript"> var myConnection:SqlConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes"); var myCommand:SqlCommand = new SqlCommand( "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'", myConnection);
myCommand.Connection.Open(); myCommand.ExecuteNonQuery(); myCommand.Connection.Close();
</Tab>
重要说明:始终记住在页完成执行之前关闭与数据模型的连接。 如果不关闭连接,则可能会在等待页实例被垃圾回收处理期间不经意地超过连接限制。
将 SQL 数据绑定到 DataGrid
下面的示例显示一个绑定到 DataGrid 控件的简单选择查询。 DataGrid 呈现包含 SQL 数据的表。