连接模式数据访问
連接模式數(shù)據訪問
ADO.NET Framework中提供了大量的類,但其核心事實上是由以下三個類組成的。
Connection--用于表示數(shù)據源的連接。
Command--用于執(zhí)行應用于數(shù)據源的命令。
DataReader--用于表示從數(shù)據源獲取的數(shù)據。
ADO.NET Framework中的其他大多數(shù)類都是由這三個類構建而來。這三個類提供了訪問數(shù)據庫數(shù)據最基本的方法,可以用它們來連接數(shù)據庫、執(zhí)行數(shù)據庫命令,并表示從數(shù)據庫返回的結果數(shù)據。
現(xiàn)在應該明白這三個類的重要性了,但事實上這三個類是不存在的。ADO.NET使用接口提供(Provider)模型,因此它實際上使用了多組不同的ADO.NET數(shù)據訪問類來與不同的數(shù)據源進行通信。
例如,實際上在前面提到的Connection類并不存在。相反地,實際上真正存在的是SqlConnection類、OracleConnection類、OleDbConnection類和ODBCConnection類。這些不同的類分別用來連接不同的數(shù)據源。
Connection、Command和DataReader類的不同實現(xiàn)被組織在下面的命名空間中。
System.Data.SqlClient--包含用于連接微軟SQL Server 7.0或更高版本數(shù)據庫的ADO .NET類。
System.Data.OleDb--包含用于連接OLEDB接口數(shù)據源的ADO.NET類。
System.Data.OracleClient--包含用于連接Oracle數(shù)據庫(需要Oracle 8i R3 [8.1.7]客戶端或更高版本)的ADO.NET類。
System.Data.SqlServerCe--包含用于連接微軟SQL Server數(shù)據庫Mobile版的ADO.NET類。
如果連接到微軟SQL Server 7.0或更高版本的數(shù)據庫,就應該盡量使用來自SqlClient命名空間的類。這些類會提供最佳的訪問性能,因為它們直接連接SQL Server數(shù)據庫的表格化數(shù)據流(Tabular Data Stream, TDS)層(TDS是微軟SQL Server數(shù)據庫用來與應用程序進行通信的底層協(xié)議)。
當然,大家使用的并不是只有微軟SQL Server一種數(shù)據庫。如果要與Oracle數(shù)據庫通信,就應該使用來自OracleClient命名空間的類。如果還要與其他類型的數(shù)據庫進行通信,就應該使用來自OleDb或Odbc命名空間的類。幾乎所有數(shù)據庫都配備了OLEDB提供程序和ODBC數(shù)據驅動接口。
由于ADO.NET遵循接口提供(Provider)模型,所以所有Connection、Command和DataReader的實現(xiàn)都繼承自其對應的基類。這些基類分別是如下三種。
DbConnection--所有Connection類的基類。
DbCommand--所有Command類的基類。
DbDataReader--所有DataReader類的基類。
這些基類都包含在命名空間System.Data.Common中。
本章中所有的示例代碼都假定工作在微軟SQL Server數(shù)據庫上,因此所有示例代碼中使用的類都來自SqlClient命名空間。同時,由于ADO.NET使用接口提供模型,因此在其他數(shù)據庫中使用的數(shù)據訪問方法和本章所介紹的方法非常類似。
注解?要在組件和頁面中使用SqlClient命名空間提供的類之前,需要首先導入System.Data. SqlClient命名空間。
在詳細討論Connection、Command和DataReader類之前,讓我們來看看如何使用這些類來構建簡單的數(shù)據訪問組件。代碼清單17-1中的組件名為Movie1,包含一個從數(shù)據庫表Movies中返回所有記錄的方法GetAll()。
代碼清單17-1? App_Code/Movie1.cs
| using System; using System.Data; using System.Data.SqlClient; using System.Web.Configuration; using System.Collections.Generic; public class Movie1 { private static readonly string _connectionString; ??? private string _title; private string _director; ??? public string Title { get { return _title; } set { _title = value; } } ??? public string Director { get { return _director; } set { _director = value; } } ??? public List<Movie1> GetAll() { List<Movie1> results = new List<Movie1>(); SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("SELECT Title,Director FROM Movies", con); using (con) { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Movie1 newMovie = new Movie1(); newMovie.Title = (string)reader["Title"]; newMovie.Director = (string)reader["Director"]; results.Add(newMovie); } } return results; } ??? static Movie1() { _connectionString = WebConfigurationManager. ConnectionStrings["Movies"].ConnectionString; } } |
代碼清單17-1中,SqlConnection對象用來表示連到微軟SQL Server數(shù)據庫上的一個連接,SqlCommand對象用來表示一個SQL SELECT命令,而命令執(zhí)行的結果表示為了一個SqlDataReader對象。
通過循環(huán)調用SqlDataReader.Read()方法,可以獲得執(zhí)行SELECT命令后所返回的每一行數(shù)據。當SELECT命令結果集中的最后一行數(shù)據被返回后,SqlDataReader.Read()方法返回false并應結束循環(huán)。
數(shù)據庫中返回的所有數(shù)據行被添加到了一個列表(List)集合中。Movie1類的一個實例用來表示所有查詢記錄。
代碼清單17-2中的頁面將使用GridView和ObjectDataSource控件來顯示數(shù)據訪問組件Movie1所返回的電影信息記錄(見圖17-1)。
代碼清單17-2? ShowMovie1.aspx
| <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title>Show Movie1</title> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView id="grdMovies" DataSourceID="srcMovies" Runat="server" /> <asp:ObjectDataSource id="srcMovies" TypeName="Movie1" SelectMethod="GetAll" Runat="server" /> </div> </form> </body> </html> |
| ? |
| (點擊查看大圖)圖17-1? 顯示電影信息記錄 |
?
【責任編輯:云霞 TEL:(010)68476606】總結
- 上一篇: 客座编辑:程学旗
- 下一篇: ADO.NET数据库操作------Sq