580 likes | 671 Views
第 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 資料庫系統 - 說明.
E N D
第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 資料庫系統-說明 • 資料庫系統本身就是一套應用程式,目前的主流是關聯式資料庫系統,例如:Access、MySQL、SQL Server和Oracle等。資料庫使用者可以使用SQL資料庫語言來儲存和管理所需資料,事實上,只有複雜應用系統,程式開發者才會替客戶量身定作所需的資料庫系統。 • 開發資料庫系統主要是在建立資料庫使用介面和決策架構,針對不同使用者需求來存取資料庫的記錄資料,至於資料庫系統本身,只負責管理和存取資料,作為應用系統的資料來源。
13-1-1 資料庫系統-資料庫的組成:資料表、記錄與欄位1 • 資料庫主要的目的是儲存資料,資料是儲存在資料庫的「資料表」(Tables),每一個資料表使用「欄位」(Fields)分類成很多群組,每一個群組是一筆「記錄」(Records),例如:通訊錄資料表的記錄,如下表所示:
13-1-1 資料庫系統-資料庫的組成:資料表、記錄與欄位2 • 資料表可以使用「索引」(Index)將資料系統化的整理,以便在大量資料中快速找到所需的資料或進行排序。例如:在通訊錄資料表使用編號欄位建立主索引鍵,或稱為「主鍵」(Primary Key),如此就可以透過編號來加速資料表記錄的搜尋和排序。
13-1-2 ASP.NET與資料庫 • Web舞台的資料庫本質並沒有轉變,其主要的功能仍然是儲存和查詢資料,只是資料庫使用介面成為HTML文件或Web表單。 • 網頁資料庫是一種結合前端HTML文件或Web表單的使用介面,配合後端Web伺服器和資料庫系統的一種應用程式架構,如下圖所示:
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,一般來說都是為了建立網頁資料庫。
13-1-4 如何建立ASP.NET網頁資料庫 • ASP.NET配合ADO.NET建立網頁資料庫的步驟,如下所示: • 建立資料庫:建立SQL Server 2005 Express或Access資料庫。 • 建立資料庫連接:使用ADO.NET的OLE DB提供者來建立資料庫連接。 • 存取資料庫:使用ADO.NET的DataReader和DataSet來存取資料庫的記錄資料。 • 執行網頁資料庫:請啟動瀏覽程式執行ASP.NET程式,以便測試網頁資料庫的執行結果。
13-2 建立資料庫連接 • 13-2-1 ADO.NET的名稱空間 • 13-2-2 建立Connection物件
13-2-1 ADO.NET的名稱空間 • ADO.NET類別分屬數個名稱空間,可以用來存取資料庫的資料。換句話說,ASP.NET程式需要匯入指定的名稱空間,才能使用ADO.NET類別來存取資料庫。主要的名稱空間說明,如下表所示:
13-2-2 建立Connection物件-說明 • Connection物件可以建立ASP.NET程式與存取資料來源的連結和初始資料庫。 • Connection物件有兩種: • OLE DB是使用OleDbConnection物件。 • SQL Server是使用SqlConnection物件。
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-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");
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";
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。
13-2-2 建立Connection物件-步驟二:開啟資料庫連接 • 在建立好Connection物件後,就可以使用Open()方法開啟資料庫連接,如下所示; objCon.Open(); • 上述程式碼使用名為objCon的Connection物件來開啟資料庫連接。
13-2-2 建立Connection物件-步驟三:資料庫操作與查詢 • 在建立好Connection資料庫連接物件後,就可以使用State屬性檢查目前資料庫的連接狀態,如下所示: if (objCon.State == ConnectionState.Open) { Response.Write("<b>目前為開啟狀態</b><br/>"); } else { Response.Write("<b>目前為關閉狀態</b><br/>"); }
13-2-2 建立Connection物件-步驟四:關閉資料庫連接 • 在完成資料庫操作後,請使用Connection物件的Close()方法關閉資料庫連接。以Connection物件objCon為例,如下所示: objCon.Close();
13-3 ADO.NET的DataReader物件 • 13-3-1 Command與DataReader物件 • 13-3-2 開啟DataReader物件 • 13-3-3 取得記錄的欄位名稱與值 • 13-3-4 使用表格顯示資料表
13-3 ADO.NET的DataReader物件 • ASP.NET網頁資料庫就是使用ADO.NET的DataReader或DataSet物件來取得記錄資料,在這一節說明Command物件執行SQL指令來取得DataReader物件的資料表記錄,下一節說明DataSet物件。 • 因為第14章才詳細說明SQL查詢指令,在本章ASP.NET程式範例都是使用同一個SQL查詢指令,如下所示: SELECT * FROM iPod
13-3-1 Command與DataReader物件-Command物件 • Command物件可以針對資料來源執行指令,以資料庫的資料來源而言,就是執行SQL指令,我們可以使用Command物件送出SQL指令來新增、刪除、更新和查詢資料表的記錄。 • ASP.NET程式需要先使用Connection物件建立和開啟資料庫連接後,才能使用Command物件執行SQL指令。Command物件也分為兩種:OLE DB是使用OleDbCommand物件,SQL Server是使用SqlCommand物件。
13-3-1 Command與DataReader物件-DataReader物件 • DataReader物件是執行SQL指令傳回的記錄資料,這是「唯讀」(Read-Only)和「只能向前」(Forward-Only)的串流資料。ASP.NET程式可以使用類似讀取文字檔案串流的方式來取得資料表記錄,每次只會從資料來源讀取一列資料(即一筆)儲存到記憶體,所以讀取資料的執行效率非常高。 • DataReader物件也分為兩種:OLE DB是使用OleDbDataReader物件,SQL Server是使用SqlDataReader物件。
13-3-2 開啟DataReader物件-步驟一:開啟Connection物件的資料庫連接 • ASP.NET程式建立DataReader物件需要使用Connection物件開啟資料庫連接,如下所示: OleDbConnection objCon = new OleDbConnection(strDbCon); objCon.Open(); • 上述程式碼建立objCon的Connection物件後,使用Open()方法開啟資料庫連接。
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指令。
13-3-2 開啟DataReader物件-步驟三:執行SQL指令查詢資料表 • 接著使用Command物件的ExecuteReader()方法執行SQL查詢指令,如下所示: OleDbDataReader objDataReader = objCmd.ExecuteReader(); • 上述程式碼取得DataReader物件objDataReader,讀者可以想像它是開啟一個資料庫的檔案串流。
13-3-2 開啟DataReader物件-步驟四:檢查狀態或讀取記錄資料 • DataReader物件是一種資料串流,可以使用IsClosed屬性檢查DataReader串流是否已經開啟,如下所示: if (objDataReader.IsClosed == false) { Response.Write("<b>DataReader物件為開啟狀態</b><br/>"); } else { Response.Write("<b>DataReader物件為關閉狀態</b><br/>"); }
13-3-2 開啟DataReader物件-步驟五:關閉DataReader和資料庫連接 • 最後可以關閉DataReader串流物件和資料庫連接,如下所示: objDataReader.Close(); objCon.Close(); • 上述程式碼使用Close()方法關閉DataReader和Connection物件。
13-3-3 取得記錄的欄位名稱與值-說明 • 當ASP.NET程式使用Command物件的ExecuteReader()方法取得DataReader物件後,我們可以將DataReader物件視為一種類似檔案的記錄串流,在檔案中的每一列是一筆記錄,一次讀取一筆記錄,如下圖所示:
13-3-3 取得記錄的欄位名稱與值-讀取記錄 • 在開啟DataReader物件後,記錄指標是指向第1筆記錄之前,程式可以使用Read()方法讀取下一筆記錄,如下所示: objDataReader.Read(); • 上述程式碼執行Read()方法,換句話說,目前記錄指標就會移到下一筆,指向第1筆記錄,即MA146LL。
13-3-3 取得記錄的欄位名稱與值-相關方法 • 現在我們可以使用欄位定義資料的原始順序來取得欄位值、檢查欄位值是否存在或欄位的資料類型。其相關方法如下表所示:
13-3-4 使用表格顯示資料表-說明 • ASP.NET程式可以使用表格,一列代表一筆記錄,每一欄為一個欄位來顯示資料表的記錄資料,程式是使用HTML/XHTML表格標籤來顯示資料表。
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>"); }
13-3-4 使用表格顯示資料表-取得欄位 • DataReader物件是一個集合物件,可以使用欄位名稱或欄位順序來取得欄位值,如下所示: Response.Write("<td>"+ objDR["Name"] + "</td>"); Response.Write("<td>" + objDR[1] + "</td>"); • 程式碼的字串Name是欄位名稱,數值1是欄位Name的原始順序,取得資料的型態是資料庫欄位的資料類型,以此例為string字串,如果是Price欄位就是decimal資料型態。
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>
13-4 ADO.NET的DataSet物件 • 13-4-1 DataSet物件的基礎 • 13-4-2 將記錄填入DataSet物件
13-4-1 DataSet物件的基礎-說明 • DataSet物件是由DataTable物件組成的集合物件,每一個DataTable物件是一個資料表,換句話說,它就是儲存在記憶體中的資料庫,DataSet物件相當於是資料庫,DataTable物件就是資料表。 • DataTable物件是以表格來儲存資料表的記錄資料,可以使用列或欄來處理,即使用DataRowCollection和DataColumnCollection集合物件。在集合物件的每一個DataRow物件是一列,也就是一筆記錄,每一個DataColumn物件是一欄。
13-4-2 將記錄填入DataSet物件-步驟一 步驟一:建立與開啟Connection物件 • 首先建立Connection物件objCon後,使用Open()方法開啟資料來源,如下所示: OleDbConnection objCon = new OleDbConnection(strDbCon); objCon.Open();
13-4-2 將記錄填入DataSet物件-步驟二 步驟二:建立DataAdapter物件 • DataSet物件是使用DataAdapter物件來取得記錄資料,此物件是DataSet與Connection物件資料來源間的橋樑,可以呼叫方法將記錄資料填入DataSet物件,如下所示: string strSQL = "SELECT * FROM iPod"; OleDbDataAdapter objDataAdapter = new OleDbDataAdapter(strSQL, objCon);
13-4-2 將記錄填入DataSet物件-步驟三 步驟三:建立DataSet物件填入記錄資料 • 接著建立DataSet物件,將取得的記錄資料填入DataSet物件,如下所示: DataSet objDataSet = new DataSet(); objDataAdapter.Fill(objDataSet, "iPod"); • 上述程式碼建立DataSet物件後,使用DataAdpater物件的Fill()方法將SQL指令的查詢結果填入第1個參數的的DataSet物件。
13-4-2 將記錄填入DataSet物件-步驟四(1) 步驟四:顯示DataTable物件的所有記錄 • 在使用DataAdapter物件將資料表記錄填入DataSet物件後,就可以使用別名取得指定的DataTable物件,如下所示: objDataSet.Tables["iPod"] • 上述程式碼可以取得DataTable物件的資料表。
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>"); }
13-4-2 將記錄填入DataSet物件-步驟五 步驟五:關閉資料庫連接 • 最後使用Close()方法關閉資料庫連接,此例的Connection物件為objCon,如下所示: objCon.Close();
補充 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()); }
13-5 DataSet物件的資料庫操作 • 13-5-1 CommandBuilder物件的使用 • 13-5-2 插入資料表記錄 • 13-5-3 更新資料表記錄 • 13-5-4 刪除資料表記錄 • 注意: 資料庫一定要有主索引才能更新與刪除資料
13-5-1 CommandBuilder物件的使用-1 • CommandBuilder物件可以配合DataSet物件,當修改DataSet物件的記錄資料後,自動建立資料表更新所需Command物件的SQL指令,就算不知道如何撰寫SQL指令,也一樣可以更新資料表的記錄資料,如下所示: OleDbCommandBuilder objCmdBuilder = new OleDbCommandBuilder(objDataAdapter); • 上述程式碼的建構子是以DataAdapter物件為參數來建立CommandBuilder物件,SQL Server版本是SqlCommandBuilder物件。
13-5-1 CommandBuilder物件的使用-2 • 因為DataSet物件的資料庫操作是針對儲存在記憶體的DataTable物件,最後仍然需要使用DataAdapter物件的Update()方法才能更新資料來源的記錄資料,如下所示: int count = objDataAdapter.Update(objDataSet, "iPod");上述程式碼使用Update()方法更新DataSet物件,傳回值count是更新的記錄數。
13-5-2 插入資料表記錄-新增DataRow物件 • ASP.NET程式在使用DataAdapter物件將資料表記錄填入DataSet物件後,就可以在資料表插入一筆新的記錄資料。在DataTable物件插入記錄就是新增DataRow物件,如下所示: DataRow objDataRow; objDataRow = objDataSet.Tables["iPod"].NewRow(); • 程式碼在宣告DataRow物件變數後,使用iPod別名取得指定的DataTable物件,然後使用NewRow()方法新增一列。
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屬性。
13-5-2 插入資料表記錄-更新DataTable物件 • 最後就可以將DataRow物件新增到DataTable物件,如下所示: objDataSet.Tables["iPod"].Rows.Add(objDataRow); 不要忘了後面要加這句 int count = objDataAdapter.Update(objDataSet, "iPod");