Download presentation
Presentation is loading. Please wait.
1
第8章 ADO.NET元件與資料繫結 8-1 資料庫的基礎 8-2 ASP.NET網頁資料庫
8-3 ADO.NET的DataReader物件 8-4 ADO.NET的DataSet物件 8-5 資料繫結的基礎 8-6 SqlDataSource資料來源控制項
2
8-1 資料庫的基礎 8-1-1 資料庫系統 8-1-2 關聯式資料庫
3
8-1-1 資料庫系統 我們所泛稱的資料庫只是資料庫系統(Database System)的一部分,資料庫系統是由資料庫(Database)和資料庫管理系統(Database Management System,DBMS)所組成,如右圖所示:
4
8-1-2 關聯式資料庫-說明 關聯式資料庫(Relational Database)是由一個或多個資料表所組成,在多個資料表間使用欄位的資料值來建立連接,以便實作資料表間的關聯性。 在關聯式資料庫是使用二維表格的資料表來儲存記錄資料,在各資料表間使用欄位值建立關聯性,透過關聯性來存取其他資料表的資料,如右圖所示:
5
8-1-2 關聯式資料庫-組成 關聯式資料庫是使用資料表(Tables)的二維表格來儲存資料,每一個資料表使用欄位(Fields)分類成很多群組,每一個群組是一筆記錄(Records),例如:通訊錄資料表,如下表所示:
6
8-2 ASP.NET網頁資料庫 8-2-1 ASP.NET與資料庫 8-2-2 ADO.NET的基礎
7
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
8-2-1 ASP.NET與資料庫-圖例 網頁資料庫就是一種結合前端HTML文件或Web表單的使用介面,配合後端Web伺服器和資料庫系統的一種應用程式架構,如下圖所示:
9
8-2-2 ADO.NET的基礎-說明 ADO.NET是微軟的資料存取技術,其主要目的是在.NET Framework平台存取資料,ADO.NET可以提供一致的物件模型來存取和編輯資料來源的資料。 換句話說,就是提供一致的資料處理方式,至於資料來源並不限資料庫,幾乎任何資料來源都可以。
10
8-2-2 ADO.NET的基礎-物件模型 ADO.NET的主要類別物件有:Connection、Command、DataAdapter、DataReader和DataSet,其物件模型如下圖所示: DataAdapter
11
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物件
12
8-2-2 ADO.NET的基礎-命名空間 ADO.NET類別分屬數個命名空間,可以用來存取資料庫的資料。ASP.NET網頁需要匯入指定的命名空間,才能使用ADO.NET類別來存取資料庫。主要的命名空間說明,如下表所示:
13
8-2-3 ASP.NET的資料控制項-說明 在ASP.NET 1.0/1.1版存取資料庫需要使用ADO.NET元件,以程式碼連接、開啟、操作和顯示資料表的記錄資料。 從ASP.NET 2.0版開始,可以直接使用資料控制項(Data Controls)建立網頁資料庫,而不用撰寫任一行程式碼。 資料控制項依其功能可以分為: 資料來源控制項 資料邊界控制項
14
8-2-3 ASP.NET的資料控制項- 資料來源控制項(說明)
資料來源控制項(DataSource Controls)可以使用宣告方式來存取資料來源的資料。例如:宣告資料來源是SQL Server資料庫和指定相關屬性後,就可以存取資料庫的記錄資料。 在資料來源控制項的背後就是ADO.NET元件的DataSet、DataReader、Connection、DataAdapter和Command物件,ASP.NET只是改為宣告的控制項標籤,所以不用撰寫任何一行程式碼,只需指定相關屬性值,就可以輕鬆存取資料來源的資料。
15
8-2-3 ASP.NET的資料控制項- 資料來源控制項(種類)
說明 SqlDataSource 存取關聯式資料庫的資料來源。可以是SQL Server,Access和Oracle等,如果使用SQL Server,控制項自動使用SqlClient類別來最佳化資料庫存取 AccessDataSource 存取微軟Access資料庫,屬於SqlDataSource控制項的特別版本 XmlDataSource 存取XML文件的資料來源,請參閱第12章 SiteMapDataSource 建立網站地圖的唯讀資料來源,請參閱第12章 ObjectDataSource 存取類別物件的資料來源,可以在多層架構存取中間層的資料來源 LinqDataSource 使用LINQ(Language-Integrated Query)從資料物件存取和修改資料,請參閱第15章 EntityDataSource 存取實體資料模型(EDM)的資料來源,請參閱第15章
16
8-2-3 ASP.NET的資料控制項- 資料邊界控制項(說明)
資料邊界控制項(DataBound Controls)也稱為資料顯示與維護控制項,它是使用者和資料來源間的橋樑,可以將資料來源取得的資料呈現給使用者檢視或編輯。簡單的說,這是一種現成的資料顯示和維護介面,可以將資料來源的資料編排成瀏覽器顯示的網頁內容。 透過資料邊界控制項,就不用自行撰寫HTML標籤、程式碼或建立控制項來編排資料來源取得的資料,現在只需新增資料邊界控制項且指定相關屬性,就可以快速建立漂亮的資料編排效果,而且支援資料編輯功能,可以新增、更新和刪除資料來源的資料。
17
8-2-3 ASP.NET的資料控制項- 資料邊界控制項(種類)
表格顯示的控制項:這類控制項可以建立傳統HTML表格的顯示外觀,讓我們以一列一筆記錄的方式來顯示資料表的記錄資料,而且提供有分頁功能,例如:GridView、DataList和ListView控制項。 單筆顯示的控制項:此類控制項可以顯示單筆記錄,如同一疊卡片,在每張卡片上顯示一筆記錄,並且提供巡覽功能可以顯示指定卡片,或前一張、後一張卡片的記錄資料,例如:DetailsView和FormView控制項。 選擇功能的控制項:即清單控制項的DropDownList和ListBox控制項,它們不只支援簡單資料繫結,也支援從資料來源控制項取得項目資料。 樹狀結構的控制項:這類控制項是用來顯示階層架構的資料,特別針對XML文件的資料來源,例如:TreeView和Menu控制項。
18
8-2-4 將資料庫加入ASP.NET網站- 資料庫類型
對於ASP.NET網站使用的資料庫來說,SQL Server Express版可以建立兩種類型的資料庫,其說明如下所示: 伺服器資料庫(Server Database):伺服器資料庫是屬於伺服器,所以,在伺服器上執行的應用程式都可以存取此資料庫(註: 會員管理部份需要使用)。 SQL Server資料庫檔(SQL Server Database File):SQL Server資料庫檔案就是使用SQL Server Express LocalDB(預設資料庫引擎),它是建立在名為「\App_Data」子資料夾的資料庫檔案。(在本書ASP.NET網站都是使用SQL Server資料庫檔來建立網頁資料庫)。
19
8-2-4 將資料庫加入ASP.NET網站- SQL Server Express LocalDB
SQL Server Express LocalDB是一個執行模式的SQL Server Express版,提供最少安裝檔案與設定,屬於一種檔案型資料庫(不用啟動資料庫伺服器,就可以使用資料庫),主要是針對應用程式開發提供SQL Server資料庫的支援,用來取代舊版SQL Server的使用者執行個體(User Instances)。
20
8-2-4 將資料庫加入ASP.NET網站- 加入資料庫
可以在Visual Studio Community開啟ASP.NET網站後,直接將資料庫加入ASP.NET網站。例如:將SQL Server資料庫School.mdf,加入ASP.NET網站的「App_Data」資料夾,如下圖所示: 選【App_Data】資料夾,執行右鍵快顯功能表的「加入/現有項目」指令,可以看到「加入現有項目」對話方塊 選加入的資料庫
21
8-3 ADO.NET的DataReader物件
8-3-2 Command物件的Execute()方法
22
8-3 ADO.NET的DataReader物件-說明
在ASP.NET程式碼可以使用ADO.NET元件的DataReader或DataSet物件取得記錄資料。因為本書在第9章才會詳細說明SQL查詢指令,所以,本章範例都是使用同一個SQL查詢指令,如下所示: SELECT * FROM Students 上述SQL指令SELECT沒有WHERE子句的任何條件,查詢結果可以取得資料表Students的所有記錄和欄位資料。
23
8-3-1 開啟DataReader物件-匯入命名空間
DataReader物件是使用類似檔案串流方式來讀取記錄資料,只能讀取,並不能插入、刪除和更新記錄資料。在ASP.NET程式的類別檔開頭需要匯入命名空間,SQL Server匯入的命名空間,如下所示: using System.Data; using System.Data.SqlClient; 在匯入命名空間後,就可以使用ADO.NET物件來存取資料庫的記錄資料。
24
8-3-1 開啟DataReader物件- 步驟一:建立Connection物件
在ASP.NET網頁建立Connection物件,首先宣告SqlConnection物件變數objCon,如下所示: strDbCon = "Data Source=(LocalDB)\\MSSQLLocalDB;" + "AttachDbFilename=" + Server.MapPath("App_Data\\School.mdf") + ";Integrated Security=True"; objCon = new SqlConnection(strDbCon); 上述程式碼使用new運算子和建構子建立名為objCon的SqlConnection物件,strDbCon變數值是SQL Server Express LocalDB的連接字串。
25
8-3-1 開啟DataReader物件- 步驟二:開啟資料庫連接
在建立Connection物件後,就可以使用Open()方法開啟資料庫連接,如下所示; objCon.Open(); 上述程式碼使用名為objCon的Connection物件開啟資料庫連接。
26
8-3-1 開啟DataReader物件- 步驟三:建立Command物件
在建立和開啟Connection物件後,就可以使用SQL指令和Connection物件作為參數來建立Command物件,如下所示: strSQL = "SELECT * FROM Students"; objCmd = new SqlCommand(strSQL, objCon); 上述程式碼使用new運算子和建構子建立Command物件,第2個參數是開啟的資料庫連接物件,表示向此資料來源執行第1個參數的SQL指令敘述。
27
8-3-1 開啟DataReader物件- 步驟四:執行SQL指令敘述查詢資料表
接著使用Command物件的ExecuteReader()方法執行SQL查詢指令,如下所示: objDR = objCmd.ExecuteReader(); 上述程式碼取得DataReader物件objDR,讀者可以想像它是開啟一個資料庫的檔案串流。
28
8-3-1 開啟DataReader物件- 步驟五:讀取記錄資料
DataReader物件是一種資料串流,在ASP.NET網頁可以使用objDR.HasRows屬性判斷是否有記錄資料,如果有就是true,然後使用while迴圈讀取資料表的記錄資料,如下所示: while (objDR.Read()) { lblOutput.Text += objDR["sid"] + " - "; lblOutput.Text += objDR["name"] + " - "; lblOutput.Text += objDR["tel"] + "<br/>"; }
29
8-3-1 開啟DataReader物件- 步驟六:關閉DataReader和資料庫連接
objDR.Close(); objCon.Close(); 上述程式碼使用Close()方法關閉DataReader和Connection物件。
30
8-3-1 開啟DataReader物件- 範例網站
ASP.NET網站:Ch8_3_1 在ASP.NET網頁取得Students資料表的DataReader物件後,以清單方式來顯示資料表的記錄資料,不過,只有顯示學號、姓名和電話欄位,如下圖所示: 2018/03/05
31
8-3-2 Command物件的Execute()方法- 指令種類
在ADO.NET元件的Command物件提供三種Execute()方法來執行SQL指令敘述,如下表所示:
32
8-3-2 Command物件的Execute()方法- ExecuteScalar()方法
lblOutput.Text = "查詢結果: " + objCmd.ExecuteScalar(); 上述程式碼執行Command物件objCmd的SQL指令,如果傳回值不只一個。例如:SQL指令如果是查詢多筆記錄,取得的是第1筆記錄的第1個欄位。
33
8-3-2 Command物件的Execute()方法- 範例網站
ASP.NET網站:Ch8_3_2 在ASP.NET網頁使用Command物件的ExecuteScalar()方法執行SQL指令敘述,在TextBox控制項輸入SQL指令,按【查詢單一欄位值】鈕可以取得單一欄位值,如下圖所示:
34
8-4 ADO.NET的DataSet物件 8-4-1 DataSet物件的基礎 8-4-2 將記錄填入DataSet物件
35
8-4-1 DataSet物件的基礎-說明 DataSet物件是由DataTable物件所組成,DataSet物件相當於是資料庫,DataTable物件就是資料表。 DataTable物件是以表格來儲存資料表的記錄資料,可以使用列或欄來處理,即使用DataRowCollection和DataColumnCollection集合物件。在集合物件的每一個DataRow物件是一列,也就是一筆記錄,每一個DataColumn物件是一欄。
36
8-4-1 DataSet物件的基礎-圖例
37
8-4-2 將記錄填入DataSet物件- 步驟一:建立與開啟Connection物件
首先使用Connection物件建立資料連接物件objCon後,使用Open()方法開啟資料來源,如下所示: objCon = new SqlConnection(strDbCon); objCon.Open();
38
8-4-2 將記錄填入DataSet物件- 步驟二:建立DataAdapter物件
DataSet物件是使用DataAdapter物件取得記錄資料,此物件是DataSet與Connection物件資料來源之間的橋樑,可以呼叫方法將記錄資料填入DataSet物件,如下所示: strSQL = "SELECT * FROM Students"; objDataAdapter = new SqlDataAdapter(strSQL, objCon);
39
8-4-2 將記錄填入DataSet物件- 步驟三:建立DataSet物件填入記錄資料
DataSet objDataSet = new DataSet(); objDataAdapter.Fill(objDataSet, "Students");
40
8-4-2 將記錄填入DataSet物件- 步驟四:顯示DataTable物件的所有記錄
使用foreach迴圈取出DataTable物件Rows屬性的每一個DataRow物件,也就是每一筆記錄,如下所示: foreach (DataRow objRow in objDataSet.Tables["Students"].Rows) { lblOutput.Text += objRow["sid"] + " - "; lblOutput.Text += objRow["name"] + " - "; lblOutput.Text += objRow["tel"] + " - "; lblOutput.Text += objRow["birthday"] + "<br/>"; }
41
8-4-2 將記錄填入DataSet物件- 步驟五:關閉資料庫連接
最後使用Close()方法關閉資料庫連接,此例的Connection物件為objCon,如下所示: objCon.Close();
42
8-4-2 將記錄填入DataSet物件- 範例網站
ASP.NET網站:Ch8_4_2 在ASP.NET網頁取得Students資料表的DataSet物件後,使用清單方式顯示資料表的記錄資料,如下圖所示: 2017/3/6
43
8-5 資料繫結的基礎 8-5-1 資料繫結簡介 8-5-2 建立ListBox控制項的簡單資料繫結
44
8-5-1 資料繫結簡介-說明 ASP.NET控制項支援資料繫結技術,能夠將不同資料來源的集合物件、陣列、DataReader或DataView(可以視為從DataSet物件建立的檢視表)等資料整合到ASP.NET控制項。 資料來源的資料會自動填入控制項,並且使用預設方式顯示資料,也可以設定控制項屬性來變更其顯示外觀。在ASP.NET使用的資料繫結技術分為兩種:簡單資料繫結和宣告式的資料繫結。
45
8-5-1 資料繫結簡介- 簡單資料繫結 在ASP.NET網頁使用簡單資料繫結(Simple Databinding)的控制項擁有DataSource屬性,可以使用實作IEnumerable介面的集合物件作為資料來源,然後呼叫DataBind()方法來建立資料繫結。 例如:清單控制項的ListBox、RadioButtonList、CheckBoxList和DropDownList等都支援簡單資料繫結。
46
8-5-1 資料繫結簡介- 宣告式的資料繫結 宣告式的資料繫結(Declarative Databinding)是一種比較複雜的資料繫結,它是使用控制項的DataSourceID屬性來建立資料繫結。 在ASP.NET網頁需要先建立「資料來源控制項」(DataSource Controls)存取資料來源的資料,然後建立「資料邊界控制項」(DataBound Controls)來顯示和維護資料來源的資料。
47
8-5-2 建立ListBox控制項的簡單資料繫結-說明
可以使用資料繫結技術來動態顯示清單的項目。
48
8-5-2 建立ListBox控制項的簡單資料繫結-建立
首先建立ArrayList物件(ArrayList集合物件的說明請參閱附錄A)作為資料來源,如下所示: ArrayList names = new ArrayList(); names.Add("陳會安"); names.Add("江小魚"); names.Add("張無忌"); names.Add("陳允傑"); 指定ListBox控制項DataSource屬性,如下所示: lstNames.DataSource = names; lstNames.DataBind();
49
8-5-2 建立ListBox控制項的簡單資料繫結- 範例網站
ASP.NET網站:Ch8_5_2 在ASP.NET網頁使用簡單資料繫結技術,以ArrayList物件作為資料來源,建立ListBox控制項的項目清單,如下圖所示:
50
8-6 SqlDataSource資料來源控制項
8-6-2 資料來源控制項的標籤內容 8-6-3 傳回沒有重複的欄位值
51
8-6-1 建立SqlDataSource控制項-說明
在Visual Studio Community建立SqlDataSource控制項,請開啟「工具箱」視窗且展開【資料】區段,只需選取SqlDataSource控制項,拖拉至Web Form表單的編輯區域,就可以建立SqlDataSource控制項。 SqlDataSource控制項
52
8-6-1 建立SqlDataSource控制項- 步驟一(新增)
在Visual Studio Community的「工具箱」視窗提供資料來源控制項,我們可以在【設計】標籤直接拖拉來新增資料來源控制項,如下圖所示:
53
8-6-1 建立SqlDataSource控制項- 步驟一(設定資料來源)
選School.mdf資料連接 建立SQL指令 測試SQL指令 將連接字串儲存在組態檔
54
8-6-1 建立SqlDataSource控制項- 步驟二:選擇控制項使用的資料來源控制項
在新增資料來源控制項和設定好資料來源後,我們就可以在ListBox控制項選擇使用的資料來源,如下圖所示: 在【選取資料來源】欄選【SqlDataSource1】,ListBox控制項顯示【name】欄位,選取欄位值是【sid】欄位
55
8-6-1 建立SqlDataSource控制項- 步驟三:新增事件處理程序來顯示使用者的選擇
請按二下名為【選擇】的按鈕控制項,可以建立Button1_Click()事件處理程序。 protected void Button1_Click(object sender, EventArgs e) { if (lstNames.SelectedIndex > -1) lblOutput.Text = "選擇的學號: " + lstNames.SelectedItem.Value; }
56
8-6-1 建立SqlDataSource控制項-範例網站
ASP.NET網站:Ch8_6_1 在ASP.NET網頁使用宣告式的資料繫結技術,建立SqlDataSource控制項來取得School.mdf資料庫的資料,以便建立ListBox控制項的項目清單,如下圖所示:
57
8-6-2 資料來源控制項的標籤內容- SqlDataSource控制項標籤(內容)
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT * FROM [Students]"> </asp:SqlDataSource>
58
8-6-2 資料來源控制項的標籤內容- SqlDataSource控制項標籤(屬性說明)
ProviderName屬性值是定義在web.config組態檔的參數,如下所示: <%$ ConnectionStrings:ConnectionString %> 參數名稱分成兩部分,前面ConnectionStrings指明取得在web.config檔案同名標籤定義的參數值,後面是ConnectionString參數名稱,可以取得此參數名稱的資料庫連接字串。
59
8-6-2 資料來源控制項的標籤內容- web.config組態檔
在Web.config組態檔的<connectionStrings>標籤定義連接字串的參數名稱和值,如下所示: <connectionStrings> <add name="ConnectionString" connectionString="(LocalDB)\MSSQLLocalDB; AttachDbFilename=|DataDirectory|\School.mdf; Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
60
8-6-3 傳回沒有重複的欄位值-說明 當我們使用資料繫結將資料庫欄位填入DropDownList控制項時,可能會遇到重複值欄位的問題,如下圖所示:
61
8-6-3 傳回沒有重複的欄位值-設定 選資料來源控制項,在「SqlDataSource工作」功能表選【設定資料來源】超連結,請重複按【下一步】鈕,直到到達設定SQL陳述式的步驟。 勾選【只傳回不重複的資料列】 按【ORDER BY】鈕新增排序條件
62
8-6-3 傳回沒有重複的欄位值-範例網站 ASP.NET網站:Ch8_6_3
在ASP.NET網頁建立SqlDataSource控制項和DropDownList控制項來顯示Students資料表(此資料表已經新增major主修欄位)學生的主修種類,因為有重複值,所以需要修改SQL指令,並且指定排序欄位是major,如下圖所示:
Similar presentations