asp.net|資料|資料庫
VWD2005中包含了SQL Server 2005 Express Edition,它是SQL Server 2005的一個免費版本,它的目標使用者是那些希望用簡單的資料庫解決方案來建立應用程式的非專業的或狂熱的開發人員。由於SQL Server Express支援完整的SQL Server編程模型,例如SQLCLR、T-SQL、預存程序、視圖、觸發器和XML資料類型,你可以使用SQL Server Express來瞭解這些技術,並且確保自己的應用程式可以運行在更高層次的平台上(例如SQL Server企業版)。SQL Server Express很容易下載和安裝(它小於36MB),Visual Studio 2005和Visual Web Developer 2005也包括了它。
Visual Studio包含了用於資料庫管理的工具,例如資料庫瀏覽器(Database Explorer)和查詢構造器(Query Builder),你可以使用它們來管理SQL Server Express資料庫。Visual Studio還支援一種新的基於檔案的資料庫,用於建立SQL Server Express資料庫並把它作為項目的一部分。同時,Visual Studio 2005 和SQL Server 2005 Express為建立和部署資料驅動的Web應用程式提供了完整的解決方案,包括下面一些特性:
◆資料庫專案資料項目
◆本機資料庫串連
◆資料庫瀏覽器管理
◆相對路徑連接字串
◆XCopy部署支援
◆整合的調試支援
本文描述Visual Studio 2005中的基於檔案的資料庫方式和設計器如何建立和使用這些資料庫。
Visual Web Developer和資料
Visual Web Developer為Web應用程式使用資料庫提供了大量的工具。你可以使用資料庫瀏覽器輕易地串連到資料庫並建立或查看資料庫圖表或大綱(schema)。你還可以使用查詢構造器對話方塊和查詢結果表格來查詢資料庫和進行資料填充。建立新資料庫(使用本地檔案)也是作為項目資料項目提供的。
一旦在Visual Web Developer中串連了資料庫,就可以把資料庫表直接拖放到頁面上,以建立資料繫結的GridView控制項。Visual Web Developer自動地建立一個關聯的資料來源控制項,並根據資料表來配置它的選擇、更新、插入和刪除操作。這種快捷操作為你節省了手動建立資料來源所需的大量工作,你也可以輕易地根據需要,用適合的資料繫結控制項代替GridView。
本地和伺服器資料庫
你可能已經熟悉了基於伺服器的資料庫和連接字串。在這種情況下,資料庫伺服器(例如SQL Server 2005)把資料庫名稱與伺服器所維護的資料庫檔案相關聯。你可以通過指定伺服器名稱、資料庫名稱和憑證來串連到基於伺服器的資料庫,例如:
"server=(local)\SQLExpress;database=Pubs;Integrated Security=true"
但是,Visual Studio 2005還支援本機資料庫的概念,它是添加到當前Web應用程式的App_Data目錄中的一個檔案。在App_Data目錄中儲存資料檔案是安全的,因為這個目錄中的內容永遠不會響應使用者的請求。這個目錄也是儲存XML檔案和其它資料存放區的推薦位置。本地的SQL Server Express資料庫帶有.MDF副檔名(例如"MyDatabase.MDF"),它是SQL Server支援的標準檔案格式。當串連到伺服器的時候,資料庫還有一個關聯的記錄檔(例如"MyDatabase_log.LDF")。資料庫檔案和記錄檔的位置必須在一起。
我們可以通過使用相對路徑連接字串把本地檔案資料庫自動地附加到SQL Server Express。相對路徑確保了應用程式遷移到任何其它地方的時候都不會中斷資料庫連接。Web應用程式中的相對路徑連接字串如下所示:
"server=(local)\SQLExpress;AttachDbFileName=|DataDirectory|MyDatabase.mdf;Integrated Security=true;User Instance=true" |
上面的連接字串還有兩個額外的屬性。AttachDbFileName屬性指定串連開啟的時候動態附加到伺服器上的資料庫檔案的位置。儘管這個屬性可以接受資料庫的完整路徑(例如使用|DataDirectory|文法),但是在運行時這個路徑會被應用程式的App_Data目錄所代替。這也保證了應用程式遷移到其它位置的時候串連不會中斷。第二個屬性是User Instance=true,它指定SQL Server Express附加資料庫的方式。在這種情況下,SQL Server Express為了把資料庫附加到新的執行個體,建立一個新的進程,在開啟串連的使用者身份下運行。在ASP.NET應用程式中,這個使用者是本地的ASPNET帳號或預設的Network Service,這依賴於作業系統。為了安全地附加非系統管理員帳號(例如ASP.NET帳號)提供的資料庫檔案,建立一個獨立的SQL Server使用者執行個體是必要的。
請注意:由於在預設情況下,所有的ASP.NET應用程式運行在同一個進程下,因此所有的應用程式會把本機資料庫附加到同一個SQL Server Express執行個體。這意味著不管應用程式最初附加的資料庫是哪一個,所有的應用程式對附加到這個執行個體的所有資料庫都擁有相同的存取權限。為了隔離不同的應用程式,你必須讓每個應用程式運行在不同的背景工作處理序或應用程式集區(在IIS 6中)中。由於這個原因,本地SQL Server資料庫主要是為了方便開發,而不是用於代替共用主機環境下的基於伺服器的資料庫。
另外一個要點是,不允許兩個使用者同時串連到一個本機資料庫。在Visual Studio中設計應用程式的時候,設計器自動地釋放串連,以保證Visual Studio和ASP.NET能夠共用資料庫檔案(例如在設計器中調試運行中的應用程式)。
建立本機資料庫
你可以輕易地在Visual Studio的Web應用程式項目中建立本機資料庫。由於Visual Studio安裝了SQL Server Express,你可以使用下面的步驟來建立一個本機資料庫、添加資料表並填充資料。
建立本機資料庫:
1. 右鍵點擊解決方案瀏覽器並選擇"添加新項…"選項。
2. 選擇"SQL資料庫"項並指定一個檔案名稱,例如"Database.mdf"。
3. Visual Studio提示把這個檔案添加到App_Data目錄中。點擊"是"。
4. Visual Studio添加這個檔案並自動地使用資料庫瀏覽器串連到這個資料庫。
給本機資料庫添加資料表:
1. 右鍵點擊資料庫瀏覽器中的Tables(資料表)節點並選擇"添加新表"選項。
2. 輸入資料庫中列的名稱和類型,可以選擇在屬性工作表格中設定其它一些列屬性。為了建立樣本Contacts資料庫,請遵循下面的步驟。
3. 把第一列的名稱設定為"ContactID",資料類型設定為"int"。取消"允許空"檢查框的選中狀態。
4. 右鍵點擊ContactID列左邊的灰色方塊並選擇"設定為主健"選項。
5. 在下方的"列屬性"表格中,展開"標識符規範"節點並把"是否為標識符"設定為"是"。
6. 把第二列的名稱設定為"ContactName",資料類型設定為"varchar(50)"。讓"允許空"檢查框保持選中狀態。
7. 按下Ctrl-S儲存表並把表名設定為"Contacts"。點擊OK儲存表。
8. 關閉表定義視窗。
用資料填充表:
1. 右鍵點擊資料庫瀏覽器中的資料表節點(例如"Contacts")並選擇"顯示表資料"選項。
2. 在顯示的表格中輸入資料表行的資料。如果使用上面的Contacts樣本,你可以在ContactName列中輸入值,資料庫會自動地產生相應的ContactID值。
3. 關閉表格視窗。
綁定到本機資料庫
為了綁定到本機資料庫,你需要使用相對路徑串連來配置ASP.NET資料來源控制項,以串連到該檔案。要把一個SQL Server Express資料庫簡單地綁定到SqlDataSource和GridView控制項,可以使用下面的步驟:
1. 雙擊解決方案瀏覽器中的一個頁面(例如"Default.aspx")。Visual Studio會開啟這個頁面。
2. 選擇頁面視窗底部的"設計檢視"標籤切換到設計檢視。
3. 雙擊解決方案瀏覽器中的資料庫檔案(例如"Database.mdf")。Visual Studio為串連開啟資料庫瀏覽器。
4. 展開Tables節點以顯示資料庫中的表。
5. 把資料庫瀏覽器中的表拖放到設計檢視中的那個開啟的頁面中。Visual Studio建立一個綁定到SqlDataSource控制項的GridView。
6. 展開GridView控制項的"智能事務面板",選中分頁、排序和編輯。
7. 按Ctrl-F5運行頁面(沒有調試)。
下面的例子顯示了一個串連到本機資料庫的GridView和SqlDataSource控制項。為了運行這個樣本,ASP.NET進程帳號必須擁有~/App_Data目錄中的MDF和LDF檔案的讀/寫入權限。這個使用權限設定過程如下:
1. 在Windows瀏覽器中選中~/App_Data/Database.MDF檔案並選擇"屬性"。
2. 選擇"安全"標籤並點擊"添加"。
3. 點擊"位置…",選擇你的電腦名稱(在列表頂部),並點擊"確定"。
4. 在對象名稱文本區,輸入ASP.NET進程帳號的名稱。在預設情況下,IIS 6.0中的名稱是"Network Service",IIS 5. x中的是"ASPNET"。
5. 在"允許"列中選中"讀"和"寫"並點擊"確定"。
6. 如果App_Data目錄中存在LDF檔案,就需要重複上述步驟,設定LDF檔案的屬性。
如果你使用Visual Studio在本機電腦上建立應用程式,那麼在預設情況下,你是擁有App_Data目錄的上述許可權的。如果某個資料庫檔案在被附加之後需要變更許可權,你必須在新許可權生效之前首先關閉應用程式定義域(application domain)。
<asp:GridView AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="ContactID" DataSourceID="SqlDataSource1" ID="GridView1" runat="server"><Columns><asp:BoundField DataField="ContactID" HeaderText="ID" ReadOnly="True" SortExpression="ID" /><asp:BoundField DataField="ContactName" HeaderText="Name" SortExpression="Name" /></Columns></asp:GridView><asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:ContactsDatabase %>" ID="SqlDataSource1" runat="server" SelectCommand="SELECT [ContactID], [ContactName] FROM [Contacts]" OnSelected="SqlDataSource1_Selected"></asp:SqlDataSource> |
部署本機資料庫
本機資料庫檔案的優勢之一在於它可以伴隨應用程式、作為應用程式的一部分遷移到其它位置或其它電腦(當然該電腦也必須運行SQL Server Express)。在移動資料庫的時候,該檔案必須處於解除鎖定(unlocked)狀態。在設計器或應用程式串連到資料庫的時候,檔案會處於鎖定狀態。為瞭解除鎖定,資料庫的所有活動串連都必須被關閉。你可以使用下面的技術來關閉資料庫的串連:
如果ASP.NET已經開啟了串連,你可以通過給Web應用程式根目錄添加一個"app_offline.htm"檔案來關閉應用程式定義域。它的作用就是關閉應用程式定義域(而不是進程)並把所有的應用程式請求重新導向(redirect)到這個檔案(返回404響應代碼)。如果要重新啟動應用程式,只需要刪除這個檔案。請注意,簡單地在頁面代碼中的關閉串連是不會釋放檔案鎖的,因為在預設情況下,ADO.NET串連池會保留活動的串連。
Visual Studio提供了Copy Web特性,它可以使用xcopy、FTP或FrontPage伺服器擴充把應用程式檔案從工作目錄複製到目標伺服器。目標電腦可以是本地的或遠端。從Visual Studio菜單條中選擇"Web網站>複製Web網站…"就可以調用Copy Web特性了。
儘管你可以使用Copy Web或簡單的xcopy或FTP操作來移動資料庫,但是為了讓應用程式繼續工作,目標電腦必須運行SQL Server Express(在同一個執行個體名下)。前面我們提到,由於ASP.NET啟動並執行所有應用程式都串連到同一個SQL執行個體,所以目標電腦上的所有應用程式必須彼此信任。如果一個應用程式不能看到其它應用程式的資料庫,那麼我們推薦用基於伺服器的方法(使用SQL認證或其它分離技術)代替本機資料庫。如果你把SQL Server Express作為開發工具,那麼你需要把SQL Server Express資料庫內容作為產品部署的一部分複製給客戶。