access|asp.net|控制項 ASP.NET 2.0包含了AccessDataSource控制項,用來從Access資料庫中將資料提取至ASP.NET 2.0(.aspx)頁面。這個控制項擁有的屬性很簡單。AccessDataSource的最重要的屬性是DataFile屬性,用來指向硬碟上MDB檔案的路徑。AccessDataSource擁有的其他屬性還有SelectCommand,用來設定一個顯示需要返回的結果集(表和列)的語句。SelectCommand必須使用SQL文法來定義。
在VWD中,可以用兩種方式來添加AccessDataSource控制項至頁面。如果MDB檔案像前面的樣本中那樣被添加至Database Explorer中,那麼可以拖放列名稱至頁面上,而且VWD將會自動建立AccessDataSource控制項和GridView來顯示資料。如果不想使用GridView或者想定製控制項,那麼可以只從工具框中添加AccessDataSource控制項並通過設定精靈進行安裝。嚮導將會提示瀏覽尋找資料檔案,並且允許通過在資料庫的表中選擇列來指定SelectCommand。如果是在VWD之外輸入頁面的,那麼可以按照如下所示代碼來輸入:
<asp:AccessDataSource>
ID="MySourcName"
Runat="server"
DataFile="MyMDBName.mdb"
SelectCommand="SELECT MyField1, MyField2 FROM MyTable">
</asp:AccessDataSource>
需要再次提及的特性很簡單。您所要提供的就是一個ID、MDB檔案名稱以及一個SelectCommand。
本文講述的是關於資料來源控制項的內容,但是回想起來資料來源控制項並不在頁面上呈現任何可見的東西。所以為了給您一個可見方式來測試資料來源控制項,下一個“試一試”將介紹使用GridView控制項(從ASP.NET 1版本的DataGrid控制項演變而來)在表格中顯示資料的基本步驟。請注意本章的重點不是在GridView的配置和定製上;在這樣的情況下,重點是在資料來源控制項上。在隨後的第5章中,將會更加詳細地研究GridView控制項。
試一試 #2—— 串連至MDB並用GridView顯示資料
在本文案例,將通過頁面上的Northwind顯示已經銷售出去的產品的資訊。
(1) 啟動頁面編輯器並瀏覽至C:\Websites\BegAspNet2Db\ch02\。
(2) 從Web Form模板中添加名為TIO-ch02-2-DisplayAccessData的頁面。單擊下方的標籤切換至Design視圖。
(3) 在頁面的頂部,輸入標題,例如“串連至MDB資料來源的示範”,並將相同的文本放入頁面的標題中。雖然在每個練習中都沒有討論過這一步,但是我們建議在每一頁中都包含一個標題和HTML文本,這樣就不會找不到正在瀏覽的頁面了。
<html>
<head>
<title>TIO ch02-1 Display MDB Data</title>
<head>
<body>
<h3>ch02 TIO 2 Demonstration of connection to an MDB source </h3>
<body>
</html>
(4) 顯示工具框(Menu:View|toolbox或者鍵入Ctrl+Alt+X)並展開工具框的Data面板。
(5) 將一個AccessDataSource控制項拖至頁面。
(6) 控制項的便捷工作面板應當自動出現,如果面板沒有自動出現,那麼可以選擇新的資料來源並單擊右上方的小箭頭來開啟便捷工作面板。單擊Configure Data Source。
(7) 在Choose a Database步驟,單擊Browse 按鈕並選擇C:\Websites\BegAspNet 2Db\App_Data\Northwind.mdb,並注意設計器將檔案說明轉換為相對參照,也就是用符號(~)表示網站的根目錄。
(8) 在Configure Select Statement對話方塊中,選擇Specify Columns選項並選擇Products表。點選星號以選擇所有列。依次單擊Next、Test Query和Finish。
(9) 選擇Data控制項並通過按下F4顯示Properties視窗。將其ID更改為NorthwindProducts。
(10) 回到工具箱的Data面板,在GridView上雙擊將控制項添加至頁面並進入Common Tasks Menu,然後單擊Choose Data Source。選擇NorthwindProducts並結束嚮導。
(11) 選擇GridView並將其ID更改為NorthwindProducts。頁面應該如下所示:
<%@ page language="VB" %>
<html>
<head><title>ch02 TIO 2 Display MDB Data</title></head>
<body>
<h3>ch02 TIO 2 Demonstration of Connection to an MDB Source </h3>
<form runat="server">
<asp:accessdatasource id="NorthwindProductsAccDataSource" runat="server"
selectcommand="Select * From Products"
datafile="~/App_Data/Northwind.mdb">
</asp:accessdatasource>
<asp:gridview id="NorthwindProductsGridView" runat="server"
datasourceid="NorthwindProductsAccDataSource">
</asp:gridview>
</form></body></html>
(12) 開啟瀏覽器並查看C:\Websites\BegAspNet2Db\ch02\ch02_TIO_2_ Dis- playAccessData.aspx(參見圖2-2)。
圖 2-2
(13) 最後的操作是從MDB Query而不是表中顯示資料。關閉瀏覽器並返回至VWD。用新名稱ch02_TIO_2_DisplayAccessData-Query.aspx儲存檔案。選擇GridView並通過單擊控制項右上方的小箭頭來開啟它的Common Task Menu。單擊Configure Data Source和Next跳過MDB檔案的選擇。在Configure Select Statement的介面上,將名稱改為“銷售分類”並點選星號以獲得所有的欄位。這個查詢使用JOIN將四個表結合在一起,限制在一個表中使用的記錄數並通過一些資料的分組和彙總操作來獲得總數。依次單擊Next、Test the Query和Finish。資料來源控制項應當像如下所示:
<asp:accessdatasource id="NorthwindProductsAccDataSource" runat="server"
selectcommand="Selcet * From [Sales by Category] "
Datafile="~/App_Data/Northwind.mdb">
</asp:accessdatasource>
(14) 開啟瀏覽器並查看頁面。
樣本說明 #2—— 串連至MDB並用GridView顯示資料
您有兩個頁面上的控制項。第一個是AccessDataSource,執行串連ADO.NET對象的所有工作,而這些對象串連那些與MDB檔案互動的JET引擎。第二個是GridView,用於擷取資料並將其格式轉化為頁面可以顯示的HTML格式。請注意給每個控制項一個有意義的名稱(ID)非常重要。然後必須確定資料繫結控制項(GridView)使用它的DataSourceID屬性來引用AccessDataSource的ID以便將AccessDataSource作為它的資料來源。
從查詢中顯示資料並不非常困難;在Access中可以不用表名稱而使用查詢名稱。這裡有兩個說明。第一,如果表或者查詢的名稱中間有空格,那麼必須用方括弧將整個名稱括起來。第二,需要使用者輸入(例如,“指定年份的銷售”需要知道是哪一年)的查詢涉及到的技術不在本書的討論範圍之內。
完成前面幾個步驟之後,就可以在頁面上看到從AccessDataSource控制項獲得的資料顯示了。後面的章節將詳細介紹GridView,但是本章還將繼續關注資料來源控制項。
選擇語句中的變數
當在VWD中建立一個資料來源時,嚮導將會要求指定需要顯示的列或者要求建立一條定製的SQL語句。在前面的“試一試”中,簡單地選擇了幾個列。可以以幾種不同的方式來指定更複雜的SQL語句:
● 使用互動對話方塊
● 在AccessDataSource嚮導(由控制項中的Configure Data Source便捷任務調用)中輸入定製的SQL語句
● 在屬性網格中輸入語句
● 直接在Source視圖的標記中輸入語句
對那些從單獨的表中返回一個或者多個列的簡單查詢來說,在Access DataSource嚮導中選擇列是一個首選技術,因為它減少了排版和文法所帶來的錯誤(請參見圖2-3) 。在這個嚮導中,可以從Name下拉式清單中選擇表或者查詢的名稱。然後您可以通過選擇所有列(*)或者任一組列來選擇表或者查詢中需要的列。如果您單擊了Order By按鈕,那麼您就可以在資料來源中按照任何列來進行排序。如果第一個列有約束,那麼將會使用在Then By中選擇的欄位。在您從嚮導中選擇選項的時候,請注意SelectCommand的實際SQL文法也同時顯示在一個唯讀文字框中。
圖 2-3
利用嚮導中的WHERE按鈕可以建立帶有參數的SQL語句,這部分內容將會在第9章中介紹。現在,我們將跳過這個選擇,但是重要的是在部署之前您將使用這些將在本書後面討論的參數。在一個部署完成的網站中,要避免直接將使用者的輸入與SQL語句串連。忽略參數問題將會使網站暴露在SQL注入攻擊的危險之中。這種攻擊技術使用了從使用者輸入而來的假字元使得原來的SQL語句無效,然後用具有破壞性的語句取而代之。可以使用參數集合來發送使用者輸入至ADO.NET參數集合,這樣可以利用集合的功能減少SQL注入的問題。
雖然Configure Data Source嚮導具有很多選項可以協助快速地建立SQL語句,但是有些時候還是需要在標記的SelectCommand中直接輸入(或者修改)SQL語句。AccessDataSource嚮導允許進行這些操作。在選擇表、查詢和列的嚮導頁面中,可以選擇“Specify a custom SQL statement or stored procedure”的選項按鈕。在嚮導頁面中選擇這個選項之後單擊Next按鈕將進入另外一個頁面,可以直接在文本地區中輸入自訂的語句。還可以使用Visual Studio QueryBuilder來可視化地建立自訂語句,所使用的工具與Access QueryBuilder的非常相似。
如果不想使用嚮導,那麼可以選擇在AccessDataSource控制項的屬性網格中輸入自訂的SQL語句,或者可以切換至Source視圖並在AccessDataSource控制項標記的SelectCommand屬性中輸入語句。
關於SQL有很多書籍(像本書一樣類型的還有Beginning SQL Programming,ISBN 1-861001-80-0) ,本書在附錄中提供了一個簡要的介紹。如果打算學習SQL文法,那麼開始階段可以學習返回記錄的一部分(TOP和DISTINCT)的命令、重新命名一個欄位(AS)的文法,以及從兩個相關聯的表返回欄位的技術(JOIN)。下面的練習將探究SQL語句中的一些變數。
試一試 #3—— 更改AccessDataSource中的選擇語句
在本練習中,將要從Northwind的Products表中顯示特定的列和特定的記錄。還將建立一個頁面用來顯示從查詢中獲得的資料。請注意在本練習中,選擇規則已經在原始碼之中了。目前,還沒有將使用者輸入作為選項。
(1) 在C:\Websites\BegAspNet2Db\ch02\中建立名為ch02_TIO_3_AlternateSelect- Commands.aspx的檔案。
(2) 以Northwind作為ID添加一個AccessDataSource控制項並設定MDB為\App_Data\Northwind.mdb。在一系列對話方塊中,設定Select命令從Products表中擷取所有的欄位( “name”=Products)。查看一下Source視圖並注意您所建立的語句,如下所示:
SELECT * FROM Products
(3) 添加GridView,將ID設定為Northwind,將資料來源設定為Northwind。如下所示是到目前為止整個頁面的樣子:
<%@ page language="VB" %>
<html>
<head runat="server">
<title>ch02 TIO 3 Alternate Select Conimands</title>
</head>
<body>
<h3>ch02 TIO 3 Alternate Select Coinmands</h3>
<form runat="server">
<asp:accessdatasource id="NorthwindAccDataSource" runat="server"
selectcommand="SELECT * FROM Products"
datafile=" ~/App_Data/Northwind.mdb" >
</asp:accessdatasource>
<asp:gridview id="GridViewl" runat="server"
datasourceid="NorthwindAccDataSource">
</asp:gridview>
</form>
</body>
</html>
(4) 現在在瀏覽器中開啟頁面,並注意如圖2-4所示的介面(在截圖中沒有顯示所有的列)。
圖 2-4
(5) 回到Design視圖並選擇AccessDataSource(不是GridView)。開啟它的便捷工作面板並單擊Configure Data Source。在Configure Select Stat ement視窗中,選擇“Specify a custom SQL statement”並單擊Next。在編輯器中修改SQL語句,如下所示:
SELECT * FROM [Products] WHERE (CategroyID=3)
(6) 單擊Next並測試查詢。單擊OK關閉對話方塊。查看一下Source視圖中的頁面並注意如下代碼:
<asp:accessdatasource id="NorthwindAccDataSource" runat="server"
selectcommand="SELECT * FROM [Products] WHERE (CategoryID = 3) "
Datafile="~App_Data/Northwind.mdb">
</asp:accessdatasource>
(7) 試著使用對話方塊來建立如下一些Select命令,也可以在Source視圖中輸入,或者兩者結合起來使用。
SELECT * FROM Products WHERE ProductID = 12
SELECT * FROM Products WHERE ProductName = 'Northwoods Cranberry Sauce'
SELECT * FROM Products WHERE ProductID <11
SELECT * FROM Products WHERE ProductID <11 ORDER BY ProductName Ascending
SELECT * FROM Products WHERE SupplierID = 6 OR SupplierID = 8
SELECT * FROM Products WHERE SupplierID = 24 AND UnitPrice > 10
樣本說明#3—— 更改AccessDataSource中的選擇語句
在首先幾個步驟中,像前面一樣建立了一個AccessDataSource控制項和GridView。但是隨後開始用Select語句進行實驗。通過複選框添加和刪除列是最直觀的。還可以在編輯器視窗中直接輸入(或者編輯)SQL語句。
添加了WHERE子句用來限制從MDB檔案中返回的記錄。如果列名沒有包含空格,那麼可以省略方括弧。如果在列名中包含了空格,那麼就必須使用這些方括弧。
MDB檔案位置中的變數
MDB檔案儲存在硬碟中的各種物理位置上:與Web頁相同的檔案夾、Web頁下的子檔案夾或者機器中的其他檔案夾等。在Visual Web Developer中,可以在設計器中經常瀏覽這些檔案,並且MDB檔案的正確路徑也已經輸入好了。但是,如果您打算輸入自己代碼的話,還需要遵循本節所介紹的文法。
AccessDataSource控制項的DataFile屬性包含的頁面路徑可以是完整(例如以磁碟機盤符開頭)也可以是相對於包含AccessDataSource的頁面的位置而指定的。路徑還可以是相對於應用程式的,即使用URL文法來引用路徑。這個文法將符號(~)替換為應用程式根目錄,比如:~\App_Data\produces.mdb。使用相對於應用程式的路徑可以更加容易地將頁面從一個位置移動到另外一個位置而不破壞對資料庫的引用,所以推薦在可能的時候都使用相對於應用程式的路徑。
首先,我們來看完全限定路徑的文法,它包含了MDB檔案的整個路徑,以檔案所在的電腦磁碟機的根目錄開頭:
<asp:accessdatasource . . .
datafile= "C:\WebSites\WebApplication\App_Data\MyMdb.mdb">
雖然這個文法可以使用,但是它的不足之處就是降低了應用程式的可移植性。如果要移動這個應用程式至另外一台機器上,那麼磁碟機或者檔案的完全限定路徑就會不一樣,而且在每次移動頁面的時候,您都需要修改DataFile屬性。
對完全限定路徑的一個改進就是使用相對路徑文法,它只需要指定與包含了AccessDataSource的頁面的完全限定路徑不相同的部分。下面是與頁面相同檔案夾中資料庫檔案的路徑文法,以相對路徑指定:
<asp:accessdatasource . . . datafile="MyMdb.mdb">
因為頁面和MDB檔案同處一個目錄,所以這些檔案的路徑沒有區別;因此,只需要指定各自的檔案名稱即可。如果MDB處於該檔案夾的下一級或更多級目錄中,那麼下面的文法與前面的非常類似。在這樣的情況下,只需要指定子檔案夾名稱,再添加斜杠和MDF檔案名稱:
<asp:accessdatasource . . . datafile="MyDaughterFolder/MyMdb.mdb">
如果MDB檔案處於頁面目錄的上級目錄中,那麼也可以使用雙句點文法來指定當前位置的上一級目錄:
<asp:accessdatasource . . . datafile="../MyMdb.mdb">
通過使用相對路徑文法,可以很容易地將應用程式從一個地方移動至另外一個地方而不用改變MDB檔案的路徑。因為頁面和MDB檔案總是形影不離(假如MDB檔案是應用程式的一部分),所以這些檔案的相對位置總是儲存一致。但是,當打算在應用程式內部移動路徑,例如將頁面移動至子目錄中,那將會發生什麼呢?在這樣的情況下,頁面和MDB檔案之間的相對位置發生了改變,那麼相對路徑文法也就不正確了。
應用程式相對文法解決了這個問題。此時,路徑總是相對於應用程式根目錄來指定的,而不是相對於頁面本身。根目錄表示為符號(~):
<asp:accessdatasource . . . datafile="~App_Data/MyMdb.mdb>
現在可以容易地行動裝置 App程式、或者在應用程式內移動頁面而不用改變對資料庫的引用了。所以,應當在可能的時候都使用應用程式相對路徑。