第8章 .NET數據庫編程_第1頁
第8章 .NET數據庫編程_第2頁
第8章 .NET數據庫編程_第3頁
第8章 .NET數據庫編程_第4頁
第8章 .NET數據庫編程_第5頁
已閱讀5頁,還剩29頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

重點內容:

ADO.NET

連接數據庫讀取數據

DataReader

填充數據集第8章ADO.NET數據庫編程一、ADO.NET在ASP.NET應用程序中訪問數據庫要通過ADO.NET來實現。ADO.NET又被稱為ActiveX數據對象(ActiveXDataObject),是從Web的角度對ADO進行檢討和改進的。ADO.NET是為了因應廣泛的數據控制而設計,所以使用起來比以前的ADO更靈活有彈性,也提供了更多的功能。ADO.NET對象模型中有五個主要的組件,分別是Connection、Command、DataSetCommand、DataSet以及DataReader。在ADO.NET對象模型中,DataSet(數據集)是最重要的對象。一般來說,一個DataSet對象就是一個記錄集的集合,可以通過命令用數據集合填充DataSet對象。ADO.NET提供了記錄集的所有數據庫功能,包括排序,分頁,過濾視圖,關系,索引,和主鍵等。可以用XML形式保持或傳輸任何DataSet對象,而且無需付出任何額外的代價,因為DataSet對象本身就是按照XML格式構造。Connection、Command、DataSetCommand以及DataReader是數據操作組件(ManagedProviders),負責建立聯機和數據操作。數據操作組件的主要功能是作為DataSet和數據源之間的橋梁,其主要功能是負責將數據源中的數據取出后填充到DataSet數據集中,或者將數據存回數據源。為了更好地支持斷開模型,ADO.NET組件將數據訪問與數據處理分離。它是通過兩個主要的組件:.NET數據提供程序(dataprovider)和Dataset來完成這一操作的。

1、組件結構一、ADO.NET一、ADO.NET1、組件結構ADO.NET體系結構的一個核心元素是.NET數據提供程序,它是專門為數據處理以及快速地只進、只讀訪問數據而設計的組件。它是包括Connection、Command、DataReader和DataAdapter對象的組件。對象名稱描述Connection提供與數據源的連接Command用于返回數據、修改數據、運行存儲過程以及發送或檢索參數信息的數據庫命令。DataReader從數據源中提供高性能的數據流DataAdapter提供連接DataSet對象和數據源的橋梁,使用Command對象在數據源中執行SQL命令,以便將數據加載到DataSet中,并使對DataSet中數據的更改與數據源保持一致。二、連接數據庫1、建立SQLServer數據庫(1)打開MicrosoftSQLServerManagementStudio,彈出“連接到服務器”對話框,如圖所示。

二、連接數據庫1、建立SQLServer數據庫(2)讀者選擇合適的服務器名稱和身份驗證方式后,在“連接到服務器”對話框單擊“連接”按鈕,連接到SQLServer服務器。連接成功后,進入程序的主界面,如圖所示。

二、連接數據庫1、建立SQLServer數據庫(3)在“對象資源管理器”中右鍵單擊“數據庫”,從彈出的上下文菜單中選擇“新建數據庫”命令,彈出如圖所示的對話框。

二、連接數據庫1、建立SQLServer數據庫(4)在“數據庫名稱”中輸入讀者想要創建的數據庫,這里輸入的名稱為SuperMarket,單擊“確定”按鈕創建SuperMarket數據庫。此時讀者會發現在“對象資源管理器”的“數據庫”節點中增加了一個名為SuperMarket的數據庫,如圖所示。

二、連接數據庫1、建立SQLServer數據庫(5)展開SuperMarket節點,右鍵單擊“表”節點,開始進行表編輯操作,如圖所示。

二、連接數據庫1、建立SQLServer數據庫(6)在右側的屬性窗體中把表的名稱改為Product,然后在編輯表的窗體中加入4列,最終結果如圖所示。

(7)右鍵單擊“編號”列,在彈出的上下文菜單在那個選擇“設置主鍵”命令,“編號”成為該表的主鍵。此時該表如圖8-8所示。

二、連接數據庫1、建立SQLServer數據庫(8)在“對象資源管理器”中右鍵單擊SuperMarket數據庫的product表,從彈出的上下文菜單中選擇“打開表”命令,向表中輸入記錄。該表中的記錄如圖所示。

二、連接數據庫2、連接SQLServer數據庫SQLServer.NETFramework數據提供程序使用SqlConnection對象提供與MicrosoftSQLServer的7.0版或它的更高版本的連接。SqlConnection的構造函數定義如下所示。publicSqlConnection(stringconnectionString);其中,參數connectionString指定了用于打開SQLServer數據庫的連接。程序清單8.1所示的代碼示例演示了使用SqlConnection對象如何創建和打開數據庫連接。使用SqlConnection對象建和打開數據庫連接:stringConnStr="server=localhost;IntegratedSecurity=True; database=SuperMarket;";SqlConnection

sqlConn=newSqlConnection(ConnStr);sqlConn.Open();二、連接數據庫2、連接SQLServer數據庫通過VisualStudio的可視化的界面進行設置連接字符串首先要在Web頁面中添加一個SqlDataSource對象,然后在屬性編輯器中選擇ConnectionString屬性,再新建一個連接,在彈出的“選擇數據源”對話框中選擇“MicrosoftSQLServer”,如圖所示。

二、連接數據庫3、連接Access數據庫用于連接Access數據庫是AccessDataSource控件,該控件繼承自SqlDataSource控件,但是該類不支持連接到受用戶名或密碼保護的Access數據庫。因此這里還是通過SqlDataSource控件來實現可視化連接數據庫。首先,創建一個受密碼保護的Access數據庫文件Northwind.mdb,該數據庫包含一個名為“運貨商”的表,該表的內容如圖所示。

二、連接數據庫3、連接Access數據庫然后創建一個名為OleDbTest.aspx的網頁,在Web頁面上添加SqlDataSource控件后,在屬性編輯器中選擇ConnectionString屬性,再新建一個連接,在彈出的“選擇數據源”對話框中選擇“MicrosoftAccess數據庫文件”,然后單擊“繼續”按鈕,彈出“添加連接”對話框,如圖所示。

三、讀取數據1、使用SqlCommand類SqlCommand類可以用來對SQLServer數據庫執行的一個Transact-SQL語句或存儲過程。SqlCommand類的CommandText屬性用于獲取或設置要對數據源執行的Transact-SQL語句或存儲過程。CommandTimeout屬性用于設置獲取或設置在終止執行命令的嘗試并生成錯誤之前的等待時間。如果SQL語句或者存儲過程中使用了參數,可以通過Parameter屬性為參數設置值。SqlCommand命令對象提供了以下幾個基本方法來執行命令:ExecuteNonQuery:可以通過該命令來執行不需要返回值的操作,例如UPDATE、INSERT和DELETE等SQL命令。該命令不返回任何行,而只是返回執行該命令時所影響到的表行數。ExecuteScalar:它可以執行SELECT查詢,但返回的是一個單值,多用于查詢聚合值的情況,如使用count()或者sum()函數的SQL命令。ExecuteReader:該方法返回一個DataReader對象,內容為與命令匹配的所有行。三、讀取數據1、使用SqlCommand類示例:演示如何使用SqlCommand類操作數據庫

添加一個名為SqlCmdTest.aspx,在該網頁的代碼文件中添加代碼:運行效果三、讀取數據2、使用OleDBCommand類OleDBCommand的使用方法和SqlCommand非常類似,由于上一節已經介紹了如何編輯數據,這里就不再贅述。下面介紹如何在數據庫文件Northwind.mdb中,進行查找記錄的操作。代碼如下:

三、讀取數據2、使用OleDBCommand類1.protectedvoidPage_Load(objectsender,EventArgse)2.{3.Stringsqlconn="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=D:\\ZhouMingHui\\ASP.NET2.0簡明教程\\代碼\\Northwind.mdb;Jet

OLEDB:DatabasePassword=111111";4.OleDbConnection

myConnection=newOleDbConnection(sqlconn);5.myConnection.Open();6.OleDbCommand

myCommand=newOleDbCommand("select*from運貨商",myConnection);7.OleDbDataReader

myReader;8.myReader=myCommand.ExecuteReader();9.Response.Write("<h3>使用OleDbCommand類讀取數據</h3><hr>");10.Response.Write("<tableborder=1cellspacing=0cellpadding=2>");11.Response.Write("<tr

bgcolor=#DAB4B4>");12.for(inti=0;i<myReader.FieldCount;i++)13.{14.Response.Write("<td>"+myReader.GetName(i)+"</td>");15.}16.Response.Write("</tr>");17.while(myReader.Read())18.{19.Response.Write("<tr>");20.for(inti=0;i<myReader.FieldCount;i++)21.{22.Response.Write("<td>"+myReader[i].ToString()+"</td>");23.}24.Response.Write("</tr>");25.}26.Response.Write("</table>");27.myReader.Close();28.myConnection.Close();29.}三、讀取數據3、使用存儲過程存儲過程(StoredProcedure)是一組為了完成特定功能的SQL語句集,經編譯后存儲在數據庫中。用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。存儲過程具有允許標準組件式編程、能夠實現較快的執行速度、能夠減少網絡流量等優點。通過SqlCommand和OleDBCommand調用存儲過程時,首先需要將其CommandType屬性設置為CommandType.StoredProcedure,這表示要執行的是一個存儲過程。屬性的默認值為CommandType.Text,表示執行SQL命令。另外該屬性值也可以設置為CommandType.TableDirect表示要直接訪問數據表,此時應該把將CommandText屬性設置為要訪問的一個或多個表的名稱。

三、讀取數據3、使用存儲過程示例代碼:1.protectedvoidPage_Load(objectsender,EventArgse) 2.{3.Stringsqlconn="DataSource=HZIEE-2E53F913F;InitialCatalog=SuperMarket;IntegratedSecurity=True";4.SqlConnection

myConnection=newSqlConnection(sqlconn);5.myConnection.Open();6.SqlCommand

myCommand=newSqlCommand();7.myCommand.Connection=myConnection;8.myCommand.CommandType=CommandType.StoredProcedure;9.myCommand.CommandText="byType";

10.SqlParameter

parInput=myCommand.Parameters.Add("@type",SqlDbType.SmallMoney);11.parInput.Direction=ParameterDirection.Input;12.parInput.Value=2;13.SqlDataReader

myReader=myCommand.ExecuteReader();.14.Response.Write("<h3>使用存儲過程查詢數據</h3><hr>");15.Response.Write("<tableborder=1cellspacing=0cellpadding=2>");17.Response.Write("<tr

bgcolor=#DAB4B4>");18.for(inti=0;i<myReader.FieldCount;i++)19.{20.Response.Write("<td>"+myReader.GetName(i)+"</td>");21.}22.Response.Write("</tr>");23.while(myReader.Read())24.{25.Response.Write("<tr>");26.for(inti=0;i<myReader.FieldCount;i++)27.{28.Response.Write("<td>"+myReader[i].ToString()+"</td>");29.}30.Response.Write("</tr>");31.}32.Response.Write("</table>");33.myReader.Close();34.myConnection.Close();35.}

三、填充數據集1、使用DataAdapter數據適配器DataAdapter表示一組數據命令和一個數據庫連接,它們用于填充DataSet

和更新數據源。DataAdapter經常和DataSet一起配合使用,作為DataSet

和數據源之間的橋接器以便檢索和保存數據。下面是幾種數據庫使用數據適配器的方法:MicrosoftSQLServer數據庫:可以通過將SqlDataAdapter與其關聯的SqlCommand和SqlConnection對象一起使用,從而提高總體性能。對于支持OLEDB的數據源:使用DataAdapter及其關聯的OleDbCommand和OleDbConnection對象。對于支持ODBC的數據源:使用DataAdapter及其關聯的OdbcCommand和OdbcConnection對象。對于Oracle數據庫:使用DataAdapter及其關聯的OracleCommand和OracleConnection

對象。使用數據適配器SqlDataAdapter的一般步驟如下:(1)建立數據庫連接(2)建立SqlCommand對象,設置要執行的SQL語句(3)建立并實例化一個SqlDataAdapter對象。如果要執行的SQL語句為Delete,則設置DeleteCommand屬性為SqlCommand對象;如果要執行的SQL語句為Insert,則設置InsertCommand屬性為SqlCommand對象;如果要執行的SQL語句為Select,則設置SelectCommand屬性為SqlCommand對象;如果要執行的SQL語句為Update,則設置UpdateCommand屬性為SqlCommand對象。(4)建立一個DataSet對象,用于接收執行SQL命令返回的數據集(5)填充數據集(6)綁定數據控件(7)關閉數據庫連接四、DataReader可以使用ADO.NETDataReader從數據庫中檢索只讀、只進的數據流。所謂“只讀”,是指在數據閱讀器DataReader上不可更新、刪除、增加記錄,所謂“只進”是指記錄的接收是順序進行且不可后退的,數據閱讀器DataReader接收到的數據是以數據庫的記錄為單位的。查詢結果在查詢執行時返回,并存儲在客戶端的網絡緩沖區中,直到用戶使用DataReader的Read方法對它們發出請求。使用DataReader可以提高應用程序的性能,原因是它只要數據可用就立即檢索數據,并且(默認情況下)一次只在內存中存儲一行,減少了系統開銷。

四、DataReader1、使用DataReader使用DataReader對象的Read方法可從查詢結果中獲取行。通過向DataReader傳遞列的名稱或序號引用,可以訪問返回行的每一列。不過,為了實現最佳性能,DataReader

提供了一系列方法,使用戶能夠訪問其本機數據類型(GetDateTime、GetDouble、GetGuid、GetInt32等)的列值。DataReader

提供未緩沖的數據流,該數據流使過程邏輯可以有效地按順序處理從數據源中返回的結果。由于數據不在內存中緩存,所以在檢索大量數據時,DataReader

是一種適合的選擇。當DataReader首先被填充時,它將被定位到Null記錄,直至第一次調用它的Read方法。這種方法與傳統ADO邏輯中默認情況下指向記錄集的第一條記錄是不同的。由于DataReader在執行SQL命令時一直要保持同數據庫的連接,在DataReader對象在開啟的狀態下,DataReader將以獨占方式使用Connection,該對象所對應的Connection連接對象不能用來執行其它的操作,如果Command包含輸出參數或返回值,那么在DataReader關閉之前,將無法訪問這些輸出參數或返回值。所以在使用完DataReader對象時,一定要使用Close方法關閉該DataReader對象,否則的話不僅會影響到數據庫連接的效率,更會阻止其它對象使用Connection連接對象來訪問數據庫。如果返回的是多個結果集,DataReader會提供NextResult方法來按順序循環訪問這些結果集。當DataReader打開時,可以使用GetSchemaTable方法檢索有關當前結果集的架構信息。GetSchemaTable返回一個填充了行和列的DataTable對象,這些行和列包含當前結果集的架構信息。對于結果集的每一列,DataTable都包含一行。架構表行的每一列都映射到在結果集中返回的列的屬性,其中ColumnName是屬性的名稱,而列的值為屬性的值。四、DataReader2、示例示例:參見本書程序清單8.6.五、填充數據集1、使用DataAdapter示例:

頁面代碼:1.<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="DataAdapterTest.aspx.cs"Inherits="DataAdapterTest"%>2.<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd">3.<htmlxmlns="/1999/xhtml">4.<headrunat="server">5.<title>演示DataAdapter的使用</title>6.</head>7.<bodyMS_POSITIONING="GridLayout">8.<h3>使用數據適配器</h3>9. <hr/>10. <formid="Form1"method="post"runat="server">11. <asp:GridViewid="DataGrid1"runat="server"Width="816px"Height="152px"></asp:GridView>12. </form>13.</body>14.</html>五、填充數據集1、使用DataAdapter示例:

后臺代碼:1. protectedvoidPage_Load(objectsender,EventArgse)2.{3.Stringsqlconn="DataSource=HZIEE-2E53F913F;InitialCatalog=SuperMarket;IntegratedSecurity=True";4.SqlConnection

myConnection=newSqlConnection(sqlconn);5.myConnection.Open();6.SqlCommand

myCommand=newSqlCommand("select*fromProduct",myConnection);7.SqlDataAdapterAdapter=newSqlDataAdapter();8.Adapter.SelectCommand=myCommand;9.DataSet

myDs=newDataSet();10.Adapter.Fill(myDs);11.GridView1.DataSource=myDs.Tables[0].DefaultView;12.GridView1.DataBind();13.myConnection.Close();14.}

五、填充數據集1、使用DataAdapter示例:

運行效果五、填充數據集2、使用DataTable,DataColumn,DataRowDataSet由一組DataTable對象組成,它具備存儲多個表數據以及表間關系的能力。這些表就存儲在DataTable對象中,而表間的關系則用DataRelation對象表示。DataTable對象中包含了DataRow和DataColumn對象,分別存放表中行和列的數據信息。Tables屬性可以獲取包含在DataSet中的表的集合。DataTable的Rows屬性表示數據表中行的集合,DataTable的Columns屬性表示數據表中列的集合。

五、填充數據集2、使用DataTable,DataColumn,DataRow示例:1.protectedvoidPage_Load(objectsender,EventArgse)2.{3.Stringsqlconn="DataSource=HZIEE-2E53F913F;InitialCatalog=SuperMarket;IntegratedSecurity=True";4.SqlConnection

myConnection=newSqlConnection(sqlconn);5.myConnection.Open();

6.SqlCommand

myCommand=newSqlCommand("select*fromProduct",myConnection);7.SqlDataAdapterAdapter=newSqlDataAdapter();8.Adapter.SelectCommand=myCommand;9.DataSet

myDs=newDataSet();10.Adapter.Fill(myDs);11.Response.Write("<h3>使用DataTable、DataColumn和DataRow</h3><hr>");12.Response.Write("<tableborder=1cellspacing=0cellpadding=2>");13.DataTable

myTable=myDs.Tables[0];14.Response.Write("<tr

bgcolor=#DAB4B4>");15.foreach(DataColumn

myColumninmyTable.Columns)16.{17.Response.Write("<td>"+myColumn.ColumnName+"</td>");18.}19.Response.Write("</tr>");20.foreach(DataRow

myRowinmyTable.Rows)21.{22.Response.Write("<tr>");23.

溫馨提示

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

評論

0/150

提交評論