1 / 58

第 13 章 ADO.NET建立網頁資料庫

第 13 章 ADO.NET建立網頁資料庫. 13-1 網頁資料庫的基礎 13-2 建立資料庫連接 13-3 ADO.NET 的 DataReader 物件 13-4 ADO.NET 的 DataSet 物件 13-5 DataSet 物件的資料庫操作 13-6 ASP.NET 控制項與資料繫結. 13-1 網頁資料庫的基礎. 13-1-1 資料庫系統 13-1-2 ASP.NET 與資料庫 13-1-3 ADO.NET 的簡介 13-1-4 如何建立 ASP.NET 網頁資料庫. 13-1-1 資料庫系統 - 說明.

colby-riley
Download Presentation

第 13 章 ADO.NET建立網頁資料庫

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第13章 ADO.NET建立網頁資料庫 • 13-1 網頁資料庫的基礎 • 13-2 建立資料庫連接 • 13-3 ADO.NET的DataReader物件 • 13-4 ADO.NET的DataSet物件 • 13-5 DataSet物件的資料庫操作 • 13-6 ASP.NET控制項與資料繫結

  2. 13-1 網頁資料庫的基礎 • 13-1-1 資料庫系統 • 13-1-2 ASP.NET與資料庫 • 13-1-3 ADO.NET的簡介 • 13-1-4 如何建立ASP.NET 網頁資料庫

  3. 13-1-1 資料庫系統-說明 • 資料庫系統本身就是一套應用程式,目前的主流是關聯式資料庫系統,例如:Access、MySQL、SQL Server和Oracle等。資料庫使用者可以使用SQL資料庫語言來儲存和管理所需資料,事實上,只有複雜應用系統,程式開發者才會替客戶量身定作所需的資料庫系統。 • 開發資料庫系統主要是在建立資料庫使用介面和決策架構,針對不同使用者需求來存取資料庫的記錄資料,至於資料庫系統本身,只負責管理和存取資料,作為應用系統的資料來源。

  4. 13-1-1 資料庫系統-資料庫的組成:資料表、記錄與欄位1 • 資料庫主要的目的是儲存資料,資料是儲存在資料庫的「資料表」(Tables),每一個資料表使用「欄位」(Fields)分類成很多群組,每一個群組是一筆「記錄」(Records),例如:通訊錄資料表的記錄,如下表所示:

  5. 13-1-1 資料庫系統-資料庫的組成:資料表、記錄與欄位2 • 資料表可以使用「索引」(Index)將資料系統化的整理,以便在大量資料中快速找到所需的資料或進行排序。例如:在通訊錄資料表使用編號欄位建立主索引鍵,或稱為「主鍵」(Primary Key),如此就可以透過編號來加速資料表記錄的搜尋和排序。

  6. 13-1-2 ASP.NET與資料庫 • Web舞台的資料庫本質並沒有轉變,其主要的功能仍然是儲存和查詢資料,只是資料庫使用介面成為HTML文件或Web表單。 • 網頁資料庫是一種結合前端HTML文件或Web表單的使用介面,配合後端Web伺服器和資料庫系統的一種應用程式架構,如下圖所示:

  7. 13-1-3 ADO.NET的簡介 • ADO.NET是微軟新一代技術,它是「ADO」(ActiveX Data Object)元件的後繼者,目前版本是2.0版。其主要目的是在.NET Framework平台存取資料,簡單的說,ASP.NET是使用ADO.NET來進行資料庫存取。 • ADO.NET的目的是提供一致的物件模型,可以存取和編輯資料來源的資料,換句話說,就是提供一致的資料處理方式,至於資料來源並不限資料庫,幾乎任何資料來源都可以。以ASP.NET來說,ADO.NET的主要功能是存取資料庫,所以ASP.NET使用ADO.NET,一般來說都是為了建立網頁資料庫。

  8. 13-1-4 如何建立ASP.NET網頁資料庫 • ASP.NET配合ADO.NET建立網頁資料庫的步驟,如下所示: • 建立資料庫:建立SQL Server 2005 Express或Access資料庫。 • 建立資料庫連接:使用ADO.NET的OLE DB提供者來建立資料庫連接。 • 存取資料庫:使用ADO.NET的DataReader和DataSet來存取資料庫的記錄資料。 • 執行網頁資料庫:請啟動瀏覽程式執行ASP.NET程式,以便測試網頁資料庫的執行結果。

  9. 13-2 建立資料庫連接 • 13-2-1 ADO.NET的名稱空間 • 13-2-2 建立Connection物件

  10. 13-2-1 ADO.NET的名稱空間 • ADO.NET類別分屬數個名稱空間,可以用來存取資料庫的資料。換句話說,ASP.NET程式需要匯入指定的名稱空間,才能使用ADO.NET類別來存取資料庫。主要的名稱空間說明,如下表所示:

  11. 13-2-2 建立Connection物件-說明 • Connection物件可以建立ASP.NET程式與存取資料來源的連結和初始資料庫。 • Connection物件有兩種: • OLE DB是使用OleDbConnection物件。 • SQL Server是使用SqlConnection物件。

  12. 13-2-2 建立Connection物件-匯入名稱空間 • 在ASP.NET程式需要匯入所需名稱空間,才能使用ADO.NET的類別和物件,如下所示: <%@ Import Namespace="System.Data" %> <%@ Import NameSpace="System.Data.OleDb" %> • SQL Server與SQL Server Express匯入的名稱空間,如下所示: <%@ Import Namespace="System.Data" %> <%@ Import NameSpace="System.Data.SqlClient" %>

  13. 13-2-2 建立Connection物件-步驟一:建立Connection物件1 • 在ASP.NET程式建立Connection物件,就是宣告和建立OleDbConnection物件變數objCon,如下所示: OleDbConnection objCon = new OleDbConnection(strDbCon); • 程式碼使用new運算子建立名為objCon的OleDbConnection物件,strDbCon變數是資料來源字串,如下所示: string strDbCon="Provider=Microsoft.Jet.OLEDB.4.0;“ + "Data Source=" + Server.MapPath("iPods.mdb");

  14. 13-2-2 建立Connection物件-步驟一:建立Connection物件2 • 連接SQL Server與SQL Server Express資料庫的SqlConnection物件,如下所示: strDbCon = "server=localhost;database=iPods;uid=sa;pwd=1234"; SqlConnection objCon = new SqlConnection(strDbCon); • 另一種寫法,如下所示: strDbCon="user id=sa;password=1234; ;" + "initial catalog=iPods;" + "data source=localhost";

  15. 13-2-2 建立Connection物件-步驟一:建立Connection物件3 • 至於SQL Server 2005 Express的連接字串,如下所示: strDbCon="Data Source=.\SQLEXPRESS;AttachDbFilename=" + Server.MapPath("iPods.mdf") + ";Integrated Security=True;" + "TrustServerCertificate=False;" + "User Instance=True;Context Connection=False"; • 上述連接字串的Data Source屬性是.\SQLEXPRESS,AttachDbFilename屬性是資料庫名稱,副檔名是.mdf。

  16. 13-2-2 建立Connection物件-步驟二:開啟資料庫連接 • 在建立好Connection物件後,就可以使用Open()方法開啟資料庫連接,如下所示; objCon.Open(); • 上述程式碼使用名為objCon的Connection物件來開啟資料庫連接。

  17. 13-2-2 建立Connection物件-步驟三:資料庫操作與查詢 • 在建立好Connection資料庫連接物件後,就可以使用State屬性檢查目前資料庫的連接狀態,如下所示: if (objCon.State == ConnectionState.Open) { Response.Write("<b>目前為開啟狀態</b><br/>"); } else { Response.Write("<b>目前為關閉狀態</b><br/>"); }

  18. 13-2-2 建立Connection物件-步驟四:關閉資料庫連接 • 在完成資料庫操作後,請使用Connection物件的Close()方法關閉資料庫連接。以Connection物件objCon為例,如下所示: objCon.Close();

  19. 13-3 ADO.NET的DataReader物件 • 13-3-1 Command與DataReader物件 • 13-3-2 開啟DataReader物件 • 13-3-3 取得記錄的欄位名稱與值 • 13-3-4 使用表格顯示資料表

  20. 13-3 ADO.NET的DataReader物件 • ASP.NET網頁資料庫就是使用ADO.NET的DataReader或DataSet物件來取得記錄資料,在這一節說明Command物件執行SQL指令來取得DataReader物件的資料表記錄,下一節說明DataSet物件。 • 因為第14章才詳細說明SQL查詢指令,在本章ASP.NET程式範例都是使用同一個SQL查詢指令,如下所示: SELECT * FROM iPod

  21. 13-3-1 Command與DataReader物件-Command物件 • Command物件可以針對資料來源執行指令,以資料庫的資料來源而言,就是執行SQL指令,我們可以使用Command物件送出SQL指令來新增、刪除、更新和查詢資料表的記錄。 • ASP.NET程式需要先使用Connection物件建立和開啟資料庫連接後,才能使用Command物件執行SQL指令。Command物件也分為兩種:OLE DB是使用OleDbCommand物件,SQL Server是使用SqlCommand物件。

  22. 13-3-1 Command與DataReader物件-DataReader物件 • DataReader物件是執行SQL指令傳回的記錄資料,這是「唯讀」(Read-Only)和「只能向前」(Forward-Only)的串流資料。ASP.NET程式可以使用類似讀取文字檔案串流的方式來取得資料表記錄,每次只會從資料來源讀取一列資料(即一筆)儲存到記憶體,所以讀取資料的執行效率非常高。 • DataReader物件也分為兩種:OLE DB是使用OleDbDataReader物件,SQL Server是使用SqlDataReader物件。

  23. 13-3-2 開啟DataReader物件-步驟一:開啟Connection物件的資料庫連接 • ASP.NET程式建立DataReader物件需要使用Connection物件開啟資料庫連接,如下所示: OleDbConnection objCon = new OleDbConnection(strDbCon); objCon.Open(); • 上述程式碼建立objCon的Connection物件後,使用Open()方法開啟資料庫連接。

  24. 13-3-2 開啟DataReader物件-步驟二:建立Command物件 • 在建立好Connection物件後,就可以使用SQL指令和Connection物件作為參數來建立Command物件,如下所示: string strSQL = "SELECT * FROM iPod"; OleDbCommand objCmd = new OleDbCommand(strSQL, objCon); • 上述程式碼使用new運算子建立Command物件,第2個參數是開啟的Connection物件,表示向此資料來源執行第1個參數的SQL指令。

  25. 13-3-2 開啟DataReader物件-步驟三:執行SQL指令查詢資料表 • 接著使用Command物件的ExecuteReader()方法執行SQL查詢指令,如下所示: OleDbDataReader objDataReader = objCmd.ExecuteReader(); • 上述程式碼取得DataReader物件objDataReader,讀者可以想像它是開啟一個資料庫的檔案串流。

  26. 13-3-2 開啟DataReader物件-步驟四:檢查狀態或讀取記錄資料 • DataReader物件是一種資料串流,可以使用IsClosed屬性檢查DataReader串流是否已經開啟,如下所示: if (objDataReader.IsClosed == false) { Response.Write("<b>DataReader物件為開啟狀態</b><br/>"); } else { Response.Write("<b>DataReader物件為關閉狀態</b><br/>"); }

  27. 13-3-2 開啟DataReader物件-步驟五:關閉DataReader和資料庫連接 • 最後可以關閉DataReader串流物件和資料庫連接,如下所示: objDataReader.Close(); objCon.Close(); • 上述程式碼使用Close()方法關閉DataReader和Connection物件。

  28. 13-3-3 取得記錄的欄位名稱與值-說明 • 當ASP.NET程式使用Command物件的ExecuteReader()方法取得DataReader物件後,我們可以將DataReader物件視為一種類似檔案的記錄串流,在檔案中的每一列是一筆記錄,一次讀取一筆記錄,如下圖所示:

  29. 13-3-3 取得記錄的欄位名稱與值-讀取記錄 • 在開啟DataReader物件後,記錄指標是指向第1筆記錄之前,程式可以使用Read()方法讀取下一筆記錄,如下所示: objDataReader.Read(); • 上述程式碼執行Read()方法,換句話說,目前記錄指標就會移到下一筆,指向第1筆記錄,即MA146LL。

  30. 13-3-3 取得記錄的欄位名稱與值-相關方法 • 現在我們可以使用欄位定義資料的原始順序來取得欄位值、檢查欄位值是否存在或欄位的資料類型。其相關方法如下表所示:

  31. 13-3-4 使用表格顯示資料表-說明 • ASP.NET程式可以使用表格,一列代表一筆記錄,每一欄為一個欄位來顯示資料表的記錄資料,程式是使用HTML/XHTML表格標籤來顯示資料表。

  32. 13-3-4 使用表格顯示資料表-讀取 • DataReader物件如同串流物件,ASP.NET程式可以使用while迴圈來讀取資料表的記錄,如下所示: while (objDR.Read()) { Response.Write("<tr>"); Response.Write("<td>"+ objDR["ModelNo"] +"</td>"); Response.Write("<td>"+ objDR["Name"] + "</td>"); Response.Write("<td>"+ objDR["Storage"] +"</td>"); Response.Write("<td>"+ objDR["Price"] + "</td>"); Response.Write("<td>"+ objDR["StockDate"] + "</td>"); Response.Write("</tr>"); }

  33. 13-3-4 使用表格顯示資料表-取得欄位 • DataReader物件是一個集合物件,可以使用欄位名稱或欄位順序來取得欄位值,如下所示: Response.Write("<td>"+ objDR["Name"] + "</td>"); Response.Write("<td>" + objDR[1] + "</td>"); • 程式碼的字串Name是欄位名稱,數值1是欄位Name的原始順序,取得資料的型態是資料庫欄位的資料類型,以此例為string字串,如果是Price欄位就是decimal資料型態。

  34. SQL 範例 • <%@ Page Language="C#" %> • <%@ Import Namespace="System.Data" %> • <%@ Import NameSpace="System.Data.SqlClient" %> • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> • <script runat="server"> • protected void Page_Load(object sender, EventArgs e) • { • SqlConnection objCon; • SqlCommand objCmd; • SqlDataReader objDR; • string strDbCon, strSQL; • // 資料庫連接字串 • strDbCon = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True"; • // 建立Connection物件 • objCon = new SqlConnection(strDbCon); • objCon.Open(); // 開啟資料庫連接 • strSQL = "SELECT * FROM Table1"; • // 建立Command物件的SQL指令 • objCmd = new SqlCommand(strSQL, objCon); • // 取得DataReader物件 • objDR = objCmd.ExecuteReader(); • if (objDR.HasRows) • { • Label1.Text = "資料表記錄: <hr/>"; • // 顯示資料表的記錄 • while (objDR.Read()) • { • Label1.Text += objDR["no"] + " - "; • Label1.Text += objDR["name"] + "<br/>"; • } • } • else • { • Label1.Text = "資料表中沒有記錄資料!"; • } • objDR.Close(); // 關閉DataReader • } • </script>

  35. 13-4 ADO.NET的DataSet物件 • 13-4-1 DataSet物件的基礎 • 13-4-2 將記錄填入DataSet物件

  36. 13-4-1 DataSet物件的基礎-說明 • DataSet物件是由DataTable物件組成的集合物件,每一個DataTable物件是一個資料表,換句話說,它就是儲存在記憶體中的資料庫,DataSet物件相當於是資料庫,DataTable物件就是資料表。 • DataTable物件是以表格來儲存資料表的記錄資料,可以使用列或欄來處理,即使用DataRowCollection和DataColumnCollection集合物件。在集合物件的每一個DataRow物件是一列,也就是一筆記錄,每一個DataColumn物件是一欄。

  37. 13-4-1 DataSet物件的基礎-圖例

  38. 13-4-2 將記錄填入DataSet物件-步驟一 步驟一:建立與開啟Connection物件 • 首先建立Connection物件objCon後,使用Open()方法開啟資料來源,如下所示: OleDbConnection objCon = new OleDbConnection(strDbCon); objCon.Open();

  39. 13-4-2 將記錄填入DataSet物件-步驟二 步驟二:建立DataAdapter物件 • DataSet物件是使用DataAdapter物件來取得記錄資料,此物件是DataSet與Connection物件資料來源間的橋樑,可以呼叫方法將記錄資料填入DataSet物件,如下所示: string strSQL = "SELECT * FROM iPod"; OleDbDataAdapter objDataAdapter = new OleDbDataAdapter(strSQL, objCon);

  40. 13-4-2 將記錄填入DataSet物件-步驟三 步驟三:建立DataSet物件填入記錄資料 • 接著建立DataSet物件,將取得的記錄資料填入DataSet物件,如下所示: DataSet objDataSet = new DataSet(); objDataAdapter.Fill(objDataSet, "iPod"); • 上述程式碼建立DataSet物件後,使用DataAdpater物件的Fill()方法將SQL指令的查詢結果填入第1個參數的的DataSet物件。

  41. 13-4-2 將記錄填入DataSet物件-步驟四(1) 步驟四:顯示DataTable物件的所有記錄 • 在使用DataAdapter物件將資料表記錄填入DataSet物件後,就可以使用別名取得指定的DataTable物件,如下所示: objDataSet.Tables["iPod"] • 上述程式碼可以取得DataTable物件的資料表。

  42. 13-4-2 將記錄填入DataSet物件-步驟四(2) • 使用foreach/in迴圈就可以取出DataTable物件Rows屬性的每一個DataRow物件,也就是每一筆記錄,如下所示: foreach (DataRow objRow in objDataSet.Tables["iPod"].Rows) { Response.Write("<tr>"); Response.Write("<td>" + objRow["ModelNo"] + "</td>"); Response.Write("<td>" + objRow["Name"] + "</td>"); Response.Write("<td>" + objRow["Price"] + "</td>"); Response.Write("<td>" + objRow["Storage"] + "</td>"); Response.Write("</tr>"); }

  43. 13-4-2 將記錄填入DataSet物件-步驟五 步驟五:關閉資料庫連接 • 最後使用Close()方法關閉資料庫連接,此例的Connection物件為objCon,如下所示: objCon.Close();

  44. 補充 protected void Button1_Click(object sender, EventArgs e) { string strDbCon="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("data1.mdb"); string strSQL = "Select * from table1"; OleDbConnection con = new OleDbConnection(strDbCon); con.Open(); if (con.State == ConnectionState.Open) { Response.Write("Open"); } OleDbDataAdapter adapter = new OleDbDataAdapter(strSQL,con); DataSet dataset = new DataSet(); adapter.Fill(dataset, "test"); DataRow row = dataset.Tables["test"].Rows[0]; Response.Write(row[1]); Response.Write(" " + dataset.Tables["test"].Rows.Count.ToString() + " " + dataset.Tables["test"].Columns.Count.ToString()); }

  45. 13-5 DataSet物件的資料庫操作 • 13-5-1 CommandBuilder物件的使用 • 13-5-2 插入資料表記錄 • 13-5-3 更新資料表記錄 • 13-5-4 刪除資料表記錄 • 注意: 資料庫一定要有主索引才能更新與刪除資料

  46. 13-5-1 CommandBuilder物件的使用-1 • CommandBuilder物件可以配合DataSet物件,當修改DataSet物件的記錄資料後,自動建立資料表更新所需Command物件的SQL指令,就算不知道如何撰寫SQL指令,也一樣可以更新資料表的記錄資料,如下所示: OleDbCommandBuilder objCmdBuilder = new OleDbCommandBuilder(objDataAdapter); • 上述程式碼的建構子是以DataAdapter物件為參數來建立CommandBuilder物件,SQL Server版本是SqlCommandBuilder物件。

  47. 13-5-1 CommandBuilder物件的使用-2 • 因為DataSet物件的資料庫操作是針對儲存在記憶體的DataTable物件,最後仍然需要使用DataAdapter物件的Update()方法才能更新資料來源的記錄資料,如下所示: int count = objDataAdapter.Update(objDataSet, "iPod");上述程式碼使用Update()方法更新DataSet物件,傳回值count是更新的記錄數。

  48. 13-5-2 插入資料表記錄-新增DataRow物件 • ASP.NET程式在使用DataAdapter物件將資料表記錄填入DataSet物件後,就可以在資料表插入一筆新的記錄資料。在DataTable物件插入記錄就是新增DataRow物件,如下所示: DataRow objDataRow; objDataRow = objDataSet.Tables["iPod"].NewRow(); • 程式碼在宣告DataRow物件變數後,使用iPod別名取得指定的DataTable物件,然後使用NewRow()方法新增一列。

  49. 13-5-2 插入資料表記錄-輸入欄位值 • 接著輸入欄位值,如下所示: objDataRow["ModelNo"] = No.Text; objDataRow["Name"] = Name.Text; objDataRow["Storage"] = Storage.Text; objDataRow["Price"] = Price.Text; objDataRow["StockDate"] = StockDate.Text; • 程式碼指定欄位值,參數是欄位名稱,欄位值是Web控制項TextBox的Text屬性。

  50. 13-5-2 插入資料表記錄-更新DataTable物件 • 最後就可以將DataRow物件新增到DataTable物件,如下所示: objDataSet.Tables["iPod"].Rows.Add(objDataRow); 不要忘了後面要加這句 int count = objDataAdapter.Update(objDataSet, "iPod");

More Related