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為建立和部署資料驅動的網路應用程式提供了完整的解決方案,包括以下一些功能:
· 資料庫專案資料項目
· 本機資料庫連線
· 資料庫瀏覽器管理
· 相對路徑連接字串
· 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="SELECT [ContactID], [ContactName] FROM [Contacts]" OnSelected="SqlData1/Select"" asp:SqlDataSource>
部署本機資料庫
本機資料庫檔案的優點之一在於它可以伴隨應用程式、作為應用程式的一部分遷移到其它位置或其它電腦(當然該電腦也必須執行SQL Server Express)。在移動資料庫的時候,該檔案必須處於解除鎖定(unlocked)狀態。在設計器或應用程式連接到資料庫的時候,檔案會處於鎖定狀態。為了解除鎖定,資料庫的所有活動連線都必須關閉。你可以使用下面的技術來關閉資料庫的連接:
· 如果ASP.NET已經開啟了連接,你可以透過為網頁應用程式根目錄新增一個"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資料庫內容複製給客戶當產品部署的一部分。