網(wǎng)站開發(fā)基礎(chǔ)教程7_第1頁
網(wǎng)站開發(fā)基礎(chǔ)教程7_第2頁
網(wǎng)站開發(fā)基礎(chǔ)教程7_第3頁
網(wǎng)站開發(fā)基礎(chǔ)教程7_第4頁
網(wǎng)站開發(fā)基礎(chǔ)教程7_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、ASP.NET 4.0網(wǎng)站建設(shè)基礎(chǔ)教程主編:王 翔LOGO第七章第七章 ADO.NET訪問數(shù)據(jù)庫訪問數(shù)據(jù)庫在ASP.NET中,提供了一系列的數(shù)據(jù)源控件,如:SqlDataSource等,通過這些控件,開發(fā)人員就能夠簡單快捷甚至無須編程可以建立數(shù)據(jù)連接并進行相應(yīng)的數(shù)據(jù)操作。但是考慮到訪問效率與操作靈活性等方面的問題,實際的開發(fā)中很少會使用數(shù)據(jù)源控件完成數(shù)據(jù)訪問,而多采用ADO.NET的方式。ADO.NET是.NET Framework中的一系列類庫,它能夠讓開發(fā)人員更加方便、靈活的在Web應(yīng)用程序中使用和操作數(shù)據(jù)。在ADO.NET中,大量的復(fù)雜的數(shù)據(jù)操作的代碼被封裝起來,所以當開發(fā)人員在ASP.

2、NET應(yīng)用程序開發(fā)中,仍然只需要編寫少量的代碼即可完成大量的復(fù)雜操作。LOGO7.1 ADO.NET概述ADO.NET是.NET框架下的一種新的數(shù)據(jù)訪問編程模型,是一組處理數(shù)據(jù)的類,它用于實現(xiàn)數(shù)據(jù)庫中數(shù)據(jù)的交互,同時提供對XML的強大支持。在ADO.NET中,使用的是數(shù)據(jù)存儲的概念,而不是數(shù)據(jù)庫的概念。簡言之,ADO.NET不但可以處理數(shù)據(jù)庫中的數(shù)據(jù),而且還可以處理其他數(shù)據(jù)存儲方式中的數(shù)據(jù),例如XML格式、Excel格式和文本文件的數(shù)據(jù)。ADO .NET具有如下新特點。(1) 斷開式連接技術(shù)(2) 數(shù)據(jù)集緩存技術(shù)(3) 更好的程序間共享(4) 易維護性(5) 可編程性(6) 高性能與可擴展性L

3、OGO7.2 初識ADO.NET核心組件DataAdapterSelectCommandInsertCommandUpdataCommandDelectCommandConnection事務(wù)Command參數(shù)DataReaderDataSetDataTableCollectionDataRowCollectionDataColumnCollectionConstraintCollectionDataTableXMLDataRelationCollection數(shù)據(jù)庫NET Framework數(shù)據(jù)提供程序數(shù)據(jù)提供程序 LOGO7.3 Connection對象在ADO.NET中,可以使用Connec

4、tion對象來連接到指定的數(shù)據(jù)源。若要連接到Microsoft SQL Server 7.0版或更高版本,使用SQL Server數(shù)據(jù)提供程序的SqlConnection對象;若要連接到OLE DB數(shù)據(jù)源或Microsoft SQL Server 6.x版或較早版本,使用OLE DB數(shù)據(jù)提供程序的OleDbConnection對象。在使用數(shù)據(jù)提供程序的核心對象前,應(yīng)首先引入對象所在的命名空間,示例代碼如下所示:using System.Data.SqlClient;/使用SQL命名空間using System.Data.Oledb/使用Oledb命名空間Connection對象中最重要的屬性是

5、ConnectionString,該屬性用來指定建立數(shù)據(jù)庫連接所需要的連接字符串。LOGO參 數(shù)說 明Data Source 設(shè)置需連接的數(shù)據(jù)庫服務(wù)器名Initial Catalog 設(shè)置連接的數(shù)據(jù)庫名稱Integrated Security 服務(wù)器的安全性設(shè)置,是否使用信任連接。值有True、False和SSPI三種,True和SSPI都表示使用信任連接Workstation Id 數(shù)據(jù)庫客戶端標識。默認為客戶端計算機名Packet Size 獲取與SQL Server通信的網(wǎng)絡(luò)數(shù)據(jù)包的大小,單位為字節(jié),有效值為51232 767,默認值為8192 User ID 登錄SQL Server的

6、賬號Password登錄SQL Server的密碼Connection Timeout 設(shè)置SqlConnection對象連接SQL數(shù)據(jù)庫服務(wù)器的超時時間,單位為秒。若在所設(shè)置的時間內(nèi)無法連接數(shù)據(jù)庫,則返回失敗。默認為15秒LOGO以Visual Studio 2010自帶的SQL Server 2008 Express數(shù)據(jù)庫的連接為例,代碼如下所示:SqlConnection conn = new SqlConnection(); /創(chuàng)建SQL Server的連接對象conn conn.ConnectionString = Data Source=.SQLEXPRESS; /服務(wù)器名與實例名

7、user id=sa;password=123456;/登錄賬號及密碼Initial catalog=newsSystem; Integrated Security=False; /連接數(shù)據(jù)庫名及其他參數(shù)若要控制對數(shù)據(jù)庫的訪問,一種較為安全的方法是使用Windows 集成安全性,此時連接字符串可以修改為:conn.ConnectionString = Data Source = .SQLEXPRESS; /服務(wù)器名與實例名Initial catalog= newsSystem;/連接數(shù)據(jù)庫名Integrated Security=True; /采用Windows集成安全性LOGO數(shù)據(jù)庫類型 數(shù)

8、據(jù)提供程序ConnectionString屬性設(shè)置示例SQL Server SQL Server數(shù)據(jù)提供程序Server=.;DataBase=Northwind;user id=sa;password=; Access OLE DB數(shù)據(jù)提供程序Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c: myAccess.mdb Oracle Oracle 數(shù)據(jù)提供程序Data Source=Servername;user=yourusername;password=yourpwd; 方 法說 明Open() 使用 ConnectionString 所指定

9、的屬性設(shè)置打開數(shù)據(jù)庫連接Close() 關(guān)閉與數(shù)據(jù)庫的連接。這是關(guān)閉任何打開連接的首選方法ChangeDatabase() 在打開連接的狀態(tài)下,更改當前數(shù)據(jù)庫Dispose() 調(diào)用Close()方法關(guān)閉與數(shù)據(jù)庫的連接,并釋放所占用的系統(tǒng)資源LOGO7.4 Command對象當建立了與數(shù)據(jù)源的連接后,就可以利用Command對象來執(zhí)行命令并從數(shù)據(jù)源中返回結(jié)果。例如,當需要執(zhí)行一條插入語句或者刪除數(shù)據(jù)庫中的某條數(shù)據(jù)記錄的時候,就可以使用Command對象。通常情況下,Command對象用于數(shù)據(jù)的操作,例如執(zhí)行數(shù)據(jù)的插入和刪除,也可以執(zhí)行數(shù)據(jù)庫及表結(jié)構(gòu)的更改。示例代碼如下所示:conn.Open(

10、);/打開數(shù)據(jù)庫連接/建立Command對象SqlCommand cmd = new SqlCommand(select * from news ,conn);LOGOCommand對象還公開了幾種可用于執(zhí)行所需操作的Execute方法。當以數(shù)據(jù)流的形式返回結(jié)果時,使用ExecuteReader方法可返回DataReader對象。使用ExecuteScalar方法可返回單個值。使用ExecuteNonQuery方法可執(zhí)行不返回行的命令。Command對象的常用屬性及方法見表。屬性/方法說 明CommandText 取得或設(shè)置要對數(shù)據(jù)源執(zhí)行的SQL命令、存儲過程或數(shù)據(jù)表名CommandType

11、獲取或設(shè)置命令類別,可取值有StoredProcedure、TableDirect、Text,代表的含義分別為存儲過程、數(shù)據(jù)表名和SQL語句,默認為Text Connection 獲取或設(shè)置Command對象所使用的數(shù)據(jù)連接屬性Parameters SQL命令參數(shù)集合Cancel() 取消Comand對象的執(zhí)行CreateParameter 創(chuàng)建Parameter對象ExecuteNonQuery() 執(zhí)行CommandText屬性指定的內(nèi)容,返回數(shù)據(jù)表被影響行數(shù)ExecuteReader() 執(zhí)行CommandText屬性指定的內(nèi)容,返回DataReader對象ExecuteScalar()

12、 執(zhí)行CommandText屬性指定的內(nèi)容,返回結(jié)果表第一行、第一列的值ExecuteXmlReader() 執(zhí)行CommandText屬性指定的內(nèi)容,返回XmlReader對象。只有SQL Server才能用此方法LOGO7.5 DataReader對象使用DataReader可以從數(shù)據(jù)庫中檢索只讀、只向前的數(shù)據(jù)流。查詢結(jié)果在查詢執(zhí)行時返回,并存儲在客戶端的網(wǎng)絡(luò)緩沖區(qū)中,直到使用DataReader的Read方法對它們發(fā)出請求。使用DataReader可以提高應(yīng)用程序的性能,因為一旦數(shù)據(jù)可用,DataReader就立即檢索該數(shù)據(jù),而不是等待返回查詢的全部結(jié)果;并且在默認情況下,該方法一次只在

13、內(nèi)存中存儲一行,從而降低了系統(tǒng)開銷。使用 DataReader檢索數(shù)據(jù)前,必須首先創(chuàng)建Command對象實例,并通過調(diào)用 Command對象的 ExecuteReader方法創(chuàng)建一個DataReader,示例如下:SqlDataReader myReader = cmd.ExecuteReader();在創(chuàng)建了DataReader對象后,就可以使用Read方法從查詢結(jié)果中獲取行。通過向DataReader傳遞列的名稱或序號引用,可以訪問返回行的每一列。不過,為了實現(xiàn)最佳性能,DataReader提供了一系列方法,它們能夠訪問其本機數(shù)據(jù)類型(GetDateTime 、GetDouble、GetG

14、uid、GetInt32等)形式的列值。LOGO屬 性/方 法說 明FieldCount獲取當前行中的列數(shù)HasRows指示DataReader是否包含查詢結(jié)果,為True表示有查詢結(jié)果IsClosed獲取DataReader對象的狀態(tài),為True表示已關(guān)閉Read()讀取下一條記錄,為True表示有下一條記錄,F(xiàn)alse表示沒有下一條記錄返回True表示有下一條記錄,返回False表示沒有下一條記錄Close()關(guān)閉 DataReader 對象GetBoolean(ColIndex)獲取指定列的布爾值形式的值, ColIndex為列序號,序號從0開始,下同GetByte(ColIndex)獲

15、取指定列的字節(jié)形式的值GetChar(ColIndex)獲取指定列的單個字符串形式的值GetDateTime(ColIndex) 獲取指定列的DateTime對象形式的值GetDecimal(ColIndex) 獲取指定列的 Decimal 對象形式的值GetDouble(ColIndex)獲取指定列的雙精度浮點數(shù)形式的值GetFieldType(ColIndex) 獲取指定對象的數(shù)據(jù)類型GetFloat(ColIndex)獲取指定列的單精度浮點數(shù)形式的值GetInt32(ColIndex)獲取指定列的 32 位有符號整數(shù)形式的值GetInt64(ColIndex)獲取指定列的 64 位有符號

16、整數(shù)形式的值GetName(ColIndex)獲取指定列的名稱GetString(ColIndex)獲取指定列的字符串形式的值GetValue(ColIndex)獲取以本機格式表示的指定列的值LOGO【案例【案例7-1】綜合運用已介紹的三個核心對象,將newsSystem數(shù)據(jù)庫中的news表的id字段(新聞編號)及title字段(新聞標題)在頁面中輸出顯示。LOGOusing System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.We

17、b.UI.WebControls;using System.Data.SqlClient; /引入數(shù)據(jù)提供程序所在的命名空間public partial class chapter7_1 : System.Web.UI.Page protected void Page_Load(object sender, EventArgs e) SqlConnection conn = new SqlConnection(); conn.ConnectionString = Data Source=.SQLEXPRESS;Initial Catalog=newsSystem;Integrated Secu

18、rity=True; conn.Open(); SqlCommand cmd = new SqlCommand();/使用不帶參數(shù)的構(gòu)造函數(shù) cmd.CommandText = select * from news; cmd.Connection = conn; SqlDataReader myReader = cmd.ExecuteReader();/創(chuàng)建DataReader對象 if (myReader.HasRows) /判斷是否有查詢結(jié)果 while (myReader.Read()/按行讀取 /按字段數(shù)據(jù)類型獲取列值 Response.Write(新聞編號:+myReader.Get

19、Int32(0)+); Response.Write(新聞標題:+myReader.GetString(1)+); else Response.Write(查詢結(jié)果為空!); myReader.Close(); conn.Close(); LOGO7.6 DataAdapter對象n 7.6.1 DataAdapter對象的常用屬性對象的常用屬性使用DataAdapter對象可以讀取、添加、更新和刪除數(shù)據(jù)源中的數(shù)據(jù)。DataAdapter提供了以下4個主要屬性,分別用來管理數(shù)據(jù)操作的“增”、“刪”、“改”、“查”四個動作。p SelectCommand屬性:該屬性用來從數(shù)據(jù)源中檢索數(shù)據(jù)。p I

20、nsertCommand屬性:該屬性用來向數(shù)據(jù)源中插入數(shù)據(jù)。p DeleteCommand屬性:該屬性用來刪除數(shù)據(jù)源里的數(shù)據(jù)。p UpdateCommand屬性:該屬性用來更新數(shù)據(jù)源里的數(shù)據(jù)。例如,可以通過如下代碼給DataAdapter對象的SelectCommand屬性賦值。/ 創(chuàng)建DataAdapter對象SqlDataAdapter sda = new SqlDataAdapter();/給DataAdapter對象的SelectCommand屬性賦值,conn為已打開的數(shù)據(jù)源連接sda.SelectCommand = new SqlCommand(select * from user

21、, conn);/后續(xù)代碼同樣,可以使用上述方式給InsertCommand、DeleteCommand和UpdateCommand屬性賦值。LOGOn 7.6.2 DataAdapter對象的常用方法對象的常用方法1. Fill方法該方法主要用來把數(shù)據(jù)源的數(shù)據(jù)填充到DataSet中的指定數(shù)據(jù)表中,返回值是影響DataSet的行數(shù)。該方法的有以下兩種常用形式:int Fill (DataSet dataset) int Fill (DataSet dataset,string srcTable)如:da.Fill (ds, news)其中,da為DataAdapter對象實例,ds為要填充數(shù)據(jù)

22、的數(shù)據(jù)集對象,news為數(shù)據(jù)集中的數(shù)據(jù)表名。當da調(diào)用Fill方法時會執(zhí)行存儲于數(shù)據(jù)適配器SelectCommand中的查詢,并將結(jié)果存儲在數(shù)據(jù)表news中,若數(shù)據(jù)表不存在,則自動創(chuàng)建該對象。LOGO2. int Update(DataSet dataSet)方法當程序調(diào)用Update方法時,DataAdapter將檢查參數(shù)DataSet每一行的RowState屬性,根據(jù)RowState屬性來檢查DataSet里的每行是否改變和改變的類型,并依次執(zhí)行所需的INSERT、UPDATE或DELETE語句,并最終將改變提交到數(shù)據(jù)源中。這個方法返回影響DataSet的行數(shù)。更準確地說,Update方法

23、會將更改解析回數(shù)據(jù)源,但自上次填充DataSet以來,其他客戶端可能已修改了數(shù)據(jù)源中的數(shù)據(jù)。若要使用當前數(shù)據(jù)刷新DataSet,應(yīng)使用DataAdapter 和Fill方法。新行將添加到該表中,更新的信息將并入現(xiàn)有行。Fill方法通過檢查DataSet中行的主鍵值及SelectCommand返回的行來確定是要添加一個新行還是更新現(xiàn)有行。如果Fill方法發(fā)現(xiàn) DataSet 中某行的主鍵值與SelectCommand返回結(jié)果中某行的主鍵值相匹配,則它將用SelectCommand返回的行中的信息更新現(xiàn)有行,并將現(xiàn)有行的 RowState 設(shè)置為Unchanged。如果SelectCommand返

24、回的行所具有的主鍵值與DataSet中行的任何主鍵值都不匹配,則Fill方法將添加RowState為Unchanged的新行。LOGO7.7 DataSet對象DataSet是一種駐留內(nèi)存的數(shù)據(jù)緩存,相當于內(nèi)存中暫存的數(shù)據(jù)庫,可以表示包括相關(guān)表、約束和表間關(guān)系在內(nèi)的整個數(shù)據(jù)集。主要由DataRelationCollection(數(shù)據(jù)關(guān)系集合)、DataTableCollection(數(shù)據(jù)表集合)和ExtendedProperties對象組成。LOGOn 7.7.1 數(shù)據(jù)表和數(shù)據(jù)表集合數(shù)據(jù)表和數(shù)據(jù)表集合1. 數(shù)據(jù)表(DataTable)創(chuàng)建DataTable時,不需要為TableName屬性提供

25、值,可以在其他時間指定該屬性,或者將其保留為空。但是,在將一個沒有TableName值的表添加到 DataSet 中時,該表會得到一個從Table0開始遞增的默認名稱TableN。可以使用相應(yīng)的DataTable構(gòu)造函數(shù)創(chuàng)建DataTable對象。如:DataTable dtNews= new DataTable(news);/創(chuàng)建DataTable對象并指定表名為newsLOGO屬性/方法說 明Columns 獲取數(shù)據(jù)表的所有字段,即DataColumnCollection集合DataSet 獲取DataTable對象所屬的DataSet對象DefaultView 獲取與數(shù)據(jù)表相關(guān)的Data

26、View對象。DataView對象可用來顯示DataTable對象的部分數(shù)據(jù)??赏ㄟ^對數(shù)據(jù)表選擇、排序等操作獲得DataView(相當于數(shù)據(jù)庫中的視圖)PrimaryKey 獲取或設(shè)置數(shù)據(jù)表的主鍵Rows 獲取數(shù)據(jù)表的所有行,即DataRowCollection集合TableName 獲取或設(shè)置數(shù)據(jù)表名Copy() 復(fù)制DataTable對象的結(jié)構(gòu)和數(shù)據(jù),返回與本DataTable對象具有同樣結(jié)構(gòu)和數(shù)據(jù)的DataTable對象NewRow() 創(chuàng)建一個與當前數(shù)據(jù)表有相同字段結(jié)構(gòu)的數(shù)據(jù)行GetErrors() 獲取包含錯誤的DataRow對象數(shù)組LOGO2. 數(shù)據(jù)表集合(DataTableCol

27、lection)DataSet的所有數(shù)據(jù)表包含于數(shù)據(jù)表集合DataTableCollection中,可以通過DataSet的Tables屬性訪問DataTableCollection。DataTableCollection有以下兩個屬性。 Count:DataSet對象所包含的DataTable個數(shù)。 Tablesindex,name:獲取DataTableCollection中下標為index或名稱為name的數(shù)據(jù)表。例如:ds.Tables0 /表示數(shù)據(jù)集對象ds中的第一個數(shù)據(jù)表ds.Tables1 /表示數(shù)據(jù)集對象ds中的第二個數(shù)據(jù)表ds.Tablesnews/表示數(shù)據(jù)集對象ds中名稱為

28、“news”的數(shù)據(jù)表可以通過使用Add方法將DataTable添加到DataTable對象的Tables集合中,再將其添加到DataSet中。例如:ds.Tables.Add(news);/將名稱為news的數(shù)據(jù)表添加到數(shù)據(jù)集ds中LOGOn 7.7.2 數(shù)據(jù)列和數(shù)據(jù)列集合數(shù)據(jù)列和數(shù)據(jù)列集合1. 數(shù)據(jù)列(DataColumn)在創(chuàng)建DataTable后,它并沒有一個結(jié)構(gòu),因此要定義表的結(jié)構(gòu)。數(shù)據(jù)表的結(jié)構(gòu)由列和約束表示,所以首先需要通過DataColumn對象創(chuàng)建列并將其添加到DataTable的Columns集合中。以下示例代碼創(chuàng)建了一個名為“news”的數(shù)據(jù)表,并定義了表結(jié)構(gòu),它由id、ti

29、tle、content三列構(gòu)成。LOGODataTable dtNews = new DataTable(news);DataColumn col1, col2, col3;col1 = new DataColumn(id);/創(chuàng)建第一列,初始化時指定列名 /使用DataType指定數(shù)據(jù)類型col1.DataType = System.Type.GetType(System.Int32); dtNews.Columns.Add(col1);/將第一列添加到news表中 col2 = new DataColumn();col2.ColumnName = title;/使用ColumnName指定

30、列名col2.DataType = System.Type.GetType(System.String); dtNews.Columns.Add(col2);/初始化的同時指定列名與數(shù)據(jù)類型col3 = new DataColumn(content, typeof(string); dtNews.Columns.Add(col3); /直接生成新列并添加到表中dtNews.Columns.Add(new DataColumn(createTime, typeof(DateTime);LOGO2. 數(shù)據(jù)列集合(DataColumnCollection)數(shù)據(jù)表中的所有列都被存放于數(shù)據(jù)列集合Data

31、ColumnColection中,通過DataTable的Columns集合可以訪問DataColumnCollection。例如:dtNews.Columnsi.Caption /代表dtNews數(shù)據(jù)表第i列的標題DataColumnColection有以下2個屬性: Count:數(shù)據(jù)表所包含的列個數(shù)。 Columnsindex,name:獲取下標為index或名稱為name的字段。例如:DS.Tables0.Columns0/表示獲取數(shù)據(jù)表DS.Tables0中的第一列DS.Tables0.Columnsid/表示獲取數(shù)據(jù)表DS.Tables0的名為“id”的列LOGOn 7.7.3 數(shù)據(jù)

32、行和數(shù)據(jù)行集合數(shù)據(jù)行和數(shù)據(jù)行集合1. 數(shù)據(jù)行(DataRow)若要向數(shù)據(jù)表中添加一個新行,需要首先聲明一個DataRow對象實例。當調(diào)用數(shù)據(jù)表的NewRow方法時會返回一個新的DataRow對象,然后數(shù)據(jù)表會根據(jù)DataColumnCollection定義的表結(jié)構(gòu)來創(chuàng)建DataRow對象,示例代碼如下:DataRow dr= dtNews.NewRow(); 向數(shù)據(jù)表添加新行之后,可以使用索引或列名來操作新行,如:dr0=12; dr1=最新新聞; 或: drid=12; drtitle= 最新新聞; 在將數(shù)據(jù)插入新行后,可以使用Add方法將該行添加到DataRowCollection中:dtNews.Rows.Add(dr);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論