650 likes | 833 Views
第 8 章 ADO.NET元件與資料繫結. 第 8 章 ADO.NET元件與資料繫結. 8-1 資料庫的基礎 8-2 ASP.NET 網頁資料庫 8-3 ADO.NET 的 DataReader 物件 8-4 ADO.NET 的 DataSet 物件 8-5 資料繫結的基礎 8-6 SqlDataSource 資料來源控制項. 8-1 資料庫的基礎. 8-1-1 資料庫系統 8-1-2 關聯式資料庫. 8-1-1 資料庫系統.
E N D
第8章 ADO.NET元件與資料繫結 • 8-1 資料庫的基礎 • 8-2 ASP.NET網頁資料庫 • 8-3 ADO.NET的DataReader物件 • 8-4 ADO.NET的DataSet物件 • 8-5 資料繫結的基礎 • 8-6 SqlDataSource資料來源控制項
8-1 資料庫的基礎 • 8-1-1 資料庫系統 • 8-1-2 關聯式資料庫
8-1-1 資料庫系統 • 我們所泛稱的資料庫只是「資料庫系統」(Database System)的一部分,資料庫系統是由資料庫(Database)和「資料庫管理系統」(Database Management System,DBMS)所組成,如右圖所示:
8-1-2 關聯式資料庫 • 關聯式資料庫是使用「資料表」(Tables)的二維表格來儲存資料,每一個資料表使用「欄位」(Fields)分類成很多群組,每一個群組是一筆「記錄」(Records),例如:通訊錄資料表,如下表所示:
8-2 ASP.NET網頁資料庫 • 8-2-1 ASP.NET與資料庫 • 8-2-2 ADO.NET的基礎 • 8-2-3 ASP.NET的資料控制項 • 8-2-4 將資料庫加入ASP.NET網站
8-2-1 ASP.NET與資料庫-說明 • ASP.NET技術的Web應用程式就是一種「資料驅動Web應用程式」(Data-driven Web Applications),網頁實際內容是分開儲存成外部資料,當存取時才動態整合出最新的內容。 • 而資料庫就是Web應用程式最常使用的外部資料來源,換句話說,大部分ASP.NET建立的資料驅動Web應用程式,就是一種資料庫驅動Web應用程式(Database-driven Web Application),即稱為網頁資料庫(Web Database)。
8-2-1 ASP.NET與資料庫-圖例 • 網頁資料庫就是一種結合前端HTML文件或Web Form表單的使用介面,配合後端Web伺服器和資料庫系統的一種應用程式架構,如下圖所示:
8-2-2 ADO.NET的基礎-說明 • ADO.NET是微軟的資料存取技術,其主要目的是在.NET Framework平台存取資料,ADO.NET可以提供一致的物件模型來存取和編輯資料來源的資料。 • 換句話說,它就是提供一致的資料處理方式,至於資料來源並不限資料庫,幾乎任何資料來源都可以。
8-2-2 ADO.NET的基礎-物件模型 • ADO.NET的主要類別物件有:Connection、Command、DataReader和DataSet,其物件模型如下圖所示:
8-2-2 ADO.NET的基礎-物件說明 • Connection物件:可以建立與資料來源間的連接。 • Command物件:對資料來源執行指令,以資料庫來說,就是執行SQL指令敘述。 • DataReader物件:可以從資料來源使用Command物件執行指令,取得唯讀(Read-Only)和只能向前(Forward-Only)的串流資料,每一次只能從資料來源讀取一列資料(即一筆)儲存到記憶體,所以執行效率非常高。 • DataSet和DataTable物件:DataSet物件是由DataTable物件組成的集合物件,DataSet物件代表儲存在記憶體的資料庫,每一個DataTable儲存一個資料表的記錄資料,並且可以設定資料表間的關聯性(Relationship)。 • DataAdapter物件:它是DataSet和Connection物件資料連接間的橋樑,可以將資料表填入DataSet物件。
8-2-2 ADO.NET的基礎-名稱空間 • ADO.NET類別分屬數個名稱空間,可以用來存取資料庫的資料。換句話說,ASP.NET網頁需要匯入指定的名稱空間,才能使用ADO.NET類別來存取資料庫。主要的名稱空間說明,如下表所示:
8-2-3 ASP.NET的資料控制項-說明 • 在ASP.NET 1.0/1.1版存取資料庫需要使用ADO.NET元件,以程式碼連接、開啟、操作和顯示資料表的記錄資料。 • 從ASP.NET 2.0版開始,我們可以直接使用資料控制項(Data Controls)建立網頁資料庫,而不用撰寫任一行程式碼。 • 資料控制項依其功能可以分為: • 資料來源控制項 • 資料邊界控制項
8-2-3 ASP.NET的資料控制項-資料來源控制項(說明) • 資料來源控制項(DataSource Controls)是ASP.NET 2.0版開始支援的控制項,可以使用宣告方式來存取資料來源的資料。例如:宣告資料來源是SQL Server資料庫和指定相關屬性後,就可以存取資料庫的記錄資料。 • 事實上,在資料來源控制項的背後就是ADO.NET元件的DataSet、DataReader、Connection和Command物件,ASP.NET只是改為宣告的控制項標籤,所以,我們不用撰寫任何一行程式碼,只需指定相關屬性值,就可以輕鬆存取資料來源的資料。
8-2-3 ASP.NET的資料控制項-資料來源控制項(種類) • 在ASP.NET共提供五種資料來源控制項,如下表所示:
8-2-3 ASP.NET的資料控制項-資料邊界控制項(說明) • 資料邊界控制項(DataBound Controls)也稱為資料顯示與維護控制項,它是使用者和資料來源間的橋樑,可以將資料來源取得的資料呈現給使用者檢視或編輯。簡單的說,這是一種現成的資料顯示和維護介面,可以將資料來源的資料編排成瀏覽程式顯示的網頁內容。 • 換句話說,透過資料邊界控制項,我們就不用自行撰寫HTML標籤、程式碼或建立控制項來編排資料來源取得的資料,現在只需新增資料邊界控制項且指定相關屬性,就可以快速建立漂亮的資料編排效果,而且支援資料編輯功能,可以新增、更新和刪除資料來源的資料。
8-2-3 ASP.NET的資料控制項-資料邊界控制項(種類) • 表格顯示的控制項:這類控制項可以建立傳統HTML表格的顯示外觀,讓我們以一列一筆記錄的方式來顯示資料表的記錄資料,而且提供有分頁功能,例如:GridView、DataList和ListView控制項。 • 單筆顯示的控制項:此類控制項可以顯示單筆記錄,如同一疊卡片,在每張卡片上顯示一筆記錄,並且提供巡覽功能可以顯示指定卡片,或前一張、後一張卡片的記錄資料,例如:DetailsView和FormView控制項。 • 選擇功能的控制項:即清單控制項的DropDownList和ListBox控制項,它們不只支援簡單資料繫結,也支援從資料來源控制項取得項目資料。 • 樹狀結構的控制項:這類控制項是用來顯示階層架構的資料,特別針對XML文件的資料來源,例如:TreeView和Menu控制項。
8-2-4 將資料庫加入ASP.NET網站-本機與伺服器資料庫 • 對於ASP.NET網站使用的資料庫來說,SQL Server 2005 Express版可以建立兩種資料庫,其說明如下所示: • 伺服器資料庫(Server Database):伺服器資料庫是屬於伺服器,所以,在伺服器上執行的應用程式都可以存取此資料庫。不過,VWD並不能建立伺服器資料庫,我們只能使用Management Studio Express管理工具來建立。 • 本機資料庫(Local Database):本機資料庫是屬於ASP.NET網站的資料庫,它是建立在名為「\App_Data」子資料夾的資料庫。本書ASP.NET網站就是使用本機資料庫來建立網頁資料庫。
8-2-4 將資料庫加入ASP.NET網站-加入資料庫 • 我們可以在VWD開啟ASP.NET網站後,直接將資料庫加入ASP.NET網站。例如:將SQL Server資料庫Products.mdf,加入ASP.NET網站的「App_Data」資料夾,如下圖所示: 選加入的資料庫
8-3 ADO.NET的DataReader物件 • 8-3-1 開啟DataReader物件 • 8-3-2 Command物件的Execute()方法
8-3 ADO.NET的DataReader物件-說明 • ASP.NET網頁資料庫可以使用ADO.NET元件的DataReader或DataSet物件來取得記錄資料。因為本書在第9章才會詳細說明SQL查詢指令,所以,本章範例都是使用同一個SQL查詢指令,如下所示: SELECT * FROM Books • 上述SQL指令SELECT沒有WHERE子句的任何條件,查詢結果可以取得資料表Books的所有記錄和欄位資料。
8-3-1 開啟DataReader物件-匯入名稱空間 • DataReader物件是使用類似檔案串流來讀取記錄資料,它只能讀取,不能插入、刪除和更新記錄資料。在ASP.NET網頁首先需要匯入名稱空間,SQL Server與SQL Server Express匯入的名稱空間,如下所示: <%@ Import Namespace="System.Data" %> <%@ Import NameSpace="System.Data.SqlClient" %> • 在匯入名稱空間後,就可以使用ADO.NET物件來存取資料庫的記錄資料。
8-3-1 開啟DataReader物件-步驟一:建立Connection物件(建立) • 在ASP.NET網頁建立Connection物件,首先宣告SqlConnection物件變數objCon,如下所示: SqlConnection objCon; objCon = new SqlConnection(strDbCon); • 上述程式碼使用new運算子和建構子來建立名為objCon的SqlConnection物件。
8-3-1 開啟DataReader物件-步驟一:建立Connection物件(連接字串) • strDbCon變數值是SQL Server 2005 Express的連接字串,如下所示: strDbCon = "Data Source=.\\SQLEXPRESS;" + "AttachDbFilename=" + Server.MapPath("App_Data\\Products.mdf") + ";Integrated Security=True;" + "TrustServerCertificate=False;" + "User Instance=True;Context Connection=False";
8-3-1 開啟DataReader物件-步驟二:開啟資料庫連接 • 在建立Connection物件後,就可以使用Open()方法開啟資料庫連接,如下所示; objCon.Open(); • 上述程式碼使用名為objCon的Connection物件來開啟資料庫連接。
8-3-1 開啟DataReader物件-步驟三:建立Command物件 • 在建立和開啟Connection物件後,就可以使用SQL指令和Connection物件作為參數來建立Command物件,如下所示: strSQL = "SELECT * FROM Books"; objCmd = new SqlCommand(strSQL, objCon); • 上述程式碼使用new運算子和建構子來建立Command物件,第2個參數是開啟的資料庫連接物件,表示向此資料來源執行第1個參數的SQL指令敘述。
8-3-1 開啟DataReader物件-步驟四:執行SQL指令敘述查詢資料表 • 接著使用Command物件的ExecuteReader()方法執行SQL查詢指令,如下所示: objDR = objCmd.ExecuteReader(); • 上述程式碼取得DataReader物件objDR,讀者可以想像它是開啟一個資料庫的檔案串流。
8-3-1 開啟DataReader物件-步驟五:讀取記錄資料 • DataReader物件是一種資料串流,在ASP.NET網頁可以使用objDR.HasRows屬性判斷是否有記錄資料,如果有為true,然後就可以使用while迴圈讀取資料表的記錄資料,如下所示: while (objDR.Read()) { lblOutput.Text += objDR["BookID"] + " - "; lblOutput.Text += objDR["BookTitle"] + " - "; lblOutput.Text += objDR["BookPrice"] + "<br/>"; }
8-3-1 開啟DataReader物件-步驟六:關閉DataReader和資料庫連接 • 最後可以關閉DataReader串流物件和資料庫連接,如下所示: objDR.Close(); objCon.Close(); • 上述程式碼使用Close()方法關閉DataReader和Connection物件。
範例 • protected void Page_Load(object sender, EventArgs e) • { • SqlConnection objCon; • SqlCommand objCmd; • SqlDataReader objDR; • string strDbCon, strSQL; • // 資料庫連接字串 • strDbCon = "Data Source=.\\SQLEXPRESS;" + • "AttachDbFilename=" + • Server.MapPath("App_Data\\Products.mdf") + • ";Integrated Security=True;" + • "TrustServerCertificate=False;" + • "User Instance=True;Context Connection=False"; • // 建立Connection物件 • objCon = new SqlConnection(strDbCon); • objCon.Open(); // 開啟資料庫連接 • strSQL = "SELECT * FROM Books"; • // 建立Command物件的SQL指令 • objCmd = new SqlCommand(strSQL, objCon); • // 取得DataReader物件 • objDR = objCmd.ExecuteReader(); • if (objDR.HasRows) • { • lblOutput.Text = "資料表記錄: <hr/>"; • // 顯示資料表的記錄 • while (objDR.Read()) • { • lblOutput.Text += objDR["BookID"] + " - "; • lblOutput.Text += objDR["BookTitle"] + " - "; • lblOutput.Text += objDR["BookPrice"] + "<br/>"; • } • } • else • { • lblOutput.Text = "資料表中沒有記錄資料!"; • } • objDR.Close(); // 關閉DataReader • objCon.Close(); // 關閉資料庫連接 • }
8-3-1 開啟DataReader物件-範例網站 ASP.NET網站:Ch8-3-1 • 在ASP.NET網頁取得Books資料表的DataReader物件後,以清單方式來顯示資料表的記錄資料,不過,只有顯示書號、書名和書價欄位,如下圖所示:
8-3-2 Command物件的Execute()方法-指令種類 • 在ADO.NET元件的Command物件提供三種Execute()方法來執行SQL指令敘述,如下表所示:
8-3-2 Command物件的Execute()方法-ExecuteScalar()方法 • ExecuteReader()方法在第8-3-1節已經說明過,ExecuteNonQuery()方法可以執行SQL語言的資料庫操作,詳見第9-4-3節的說明。在這一節筆者將說明ExecuteScalar()方法,可以取得資料表指定記錄的單一欄位值,如下所示: lblOutput.Text = "查詢結果: " + objCmd.ExecuteScalar(); • 上述程式碼執行Command物件objCmd的SQL指令,如果傳回值不只一個。例如:SQL指令如果是查詢多筆記錄,取得的是第1筆記錄的第1個欄位。
8-3-2 Command物件的Execute()方法-ExecuteScalar()方法 ASP.NET網站:Ch8-3-2 • 在ASP.NET網頁使用Command物件的ExecuteScalar()方法執行SQL指令敘述,在TextBox控制項輸入SQL指令,按【查詢】鈕,就可以取得單一欄位值,如下圖所示:
8-4 ADO.NET的DataSet物件 • 8-4-1 DataSet物件的基礎 • 8-4-2 將記錄填入DataSet物件
8-4-1 DataSet物件的基礎-說明 • DataSet物件是由DataTable物件所組成,DataSet物件相當於是資料庫,DataTable物件就是資料表。 • DataTable物件是以表格來儲存資料表的記錄資料,可以使用列或欄來處理,即使用DataRowCollection和DataColumnCollection集合物件。在集合物件的每一個DataRow物件是一列,也就是一筆記錄,每一個DataColumn物件是一欄。
8-4-2 將記錄填入DataSet物件-步驟一:建立與開啟Connection物件 • 首先使用Connection物件建立資料連接物件objCon後,使用Open()方法開啟資料來源,如下所示: objCon = new SqlConnection(strDbCon); objCon.Open();
8-4-2 將記錄填入DataSet物件-步驟二:建立DataAdapter物件 • DataSet物件是使用DataAdapter物件來取得記錄資料,此物件是DataSet與Connection物件資料來源間的橋樑,可以呼叫方法將記錄資料填入DataSet物件,如下所示: strSQL = "SELECT * FROM Books"; objDataAdapter = new SqlDataAdapter( strSQL, objCon); • 上述程式碼建立DataAdapter物件,第1個參數是SQL查詢指令來取得記錄資料,第2個參數是開啟的Connection物件。
8-4-2 將記錄填入DataSet物件-步驟三:建立DataSet物件填入記錄資料 • 接著建立DataSet物件,將取得的記錄資料填入DataSet物件,如下所示: DataSet objDataSet = new DataSet(); objDataAdapter.Fill(objDataSet, "Books"); • 上述程式碼建立DataSet物件後,使用DataAdpater物件的Fill()方法將SQL指令的查詢結果填入第1個參數的的DataSet物件。更正確的說,就是新增DataTable物件,第2個參數是DataTable物件的別名。
8-4-2 將記錄填入DataSet物件-步驟四:顯示DataTable物件的所有記錄 • 使用foreach迴圈取出DataTable物件Rows屬性的每一個DataRow物件,也就是每一筆記錄,如下所示: foreach (DataRow objRow in objDataSet.Tables["Books"].Rows) { lblOutput.Text += objRow["BookID"] + " - "; lblOutput.Text += objRow["BookTitle"] + " - "; lblOutput.Text += objRow["BookAuthor"] + " - "; lblOutput.Text += objRow["BookPrice"] + "<br/>"; }
8-4-2 將記錄填入DataSet物件-步驟五:關閉資料庫連接 • 最後使用Close()方法關閉資料庫連接,此例的Connection物件為objCon,如下所示: objCon.Close();
8-4-2 將記錄填入DataSet物件-範例網站 ASP.NET網站:Ch8-4-2 • 在ASP.NET網頁取得Book資料表的DataSet物件後,使用清單方式來顯示資料表的記錄資料,如下圖所示:
8-5 資料繫結的基礎 • 8-5-1 資料繫結簡介 • 8-5-2 建立ListBox控制項的簡單資料繫結
8-5-1 資料繫結簡介-說明 • ASP.NET控制項支援資料繫結技術,能夠將不同資料來源的集合物件、陣列、DataReader或DataView(可以視為從DataSet物件建立的檢視表)等資料整合到ASP.NET控制項。 • 換句話說,資料來源的資料會自動填入控制項,並且使用預設方式顯示資料,當然,我們可以設定控制項屬性來變更其顯示外觀。在ASP.NET使用的資料繫結技術分為兩種:簡單資料繫結和宣告式的資料繫結。
8-5-1 資料繫結簡介-簡單資料繫結 • 在ASP.NET網頁使用簡單資料繫結(Simple Databinding)的控制項擁有DataSource屬性,可以使用實作IEnumerable介面的集合物件作為資料來源,然後呼叫DataBind()方法來建立資料繫結。 • 例如:清單控制項的ListBox、RadioButtonList、CheckBoxList和DropDownList等都支援簡單資料繫結。
8-5-1 資料繫結簡介-宣告式的資料繫結 • 宣告式的資料繫結(Declarative Databinding)是一種比較複雜的資料繫結,它是使用控制項的DataSourceID屬性來建立資料繫結。 • 在ASP.NET網頁需要先建立「資料來源控制項」(DataSource Controls)存取資料來源的資料,然後建立「資料邊界控制項」(DataBound Controls)來顯示和維護資料來源的資料。
8-5-2 建立ListBox控制項的簡單資料繫結-說明 • 簡單資料繫結可以使用集合物件作為資料來源,其最常的應用是建立List清單控制項的項目。 • 換句話說,我們可以使用資料繫結技術來動態顯示清單的項目。
8-5-2 建立ListBox控制項的簡單資料繫結-建立 • 首先建立ArrayList物件作為資料來源,如下所示: ArrayList names = new ArrayList(); names.Add("陳會安"); names.Add("江小魚"); names.Add("張無忌"); names.Add("陳允傑"); • 接著指定ListBox控制項的DataSource屬性,如下所示: lstNames.DataSource = names; lstNames.DataBind();
8-5-2 建立ListBox控制項的簡單資料繫結-範例網站 ASP.NET網站:Ch8-5-2 • 在ASP.NET網頁使用簡單資料繫結技術,以ArrayList物件作為資料來源,建立ListBox控制項的項目清單,如下圖所示: