使用Visual Web Developer在ASP.NET中操作數(shù)據(jù)庫(kù)
VWD2005中包含了SQL Server 2005 Express Edition,它是SQL Server 2005的一個(gè)免費(fèi)版本,它的目標(biāo)用戶是那些希望用簡(jiǎn)單的數(shù)據(jù)庫(kù)解決方案來(lái)建立應(yīng)用程序的非專業(yè)的或狂熱的開(kāi)發(fā)者。由于SQL Server Express支持完整的SQL Server編程模型,例如SQLCLR、T-SQL、存儲(chǔ)過(guò)程、視圖、觸發(fā)器和XML數(shù)據(jù)類型,你可以使用SQL Server Express來(lái)了解這些技術(shù),并且確保自己的應(yīng)用程序可以運(yùn)行在更高層次的平臺(tái)上(例如SQL Server企業(yè)版)。SQL Server Express很容易下載和安裝(它小于36MB),Visual Studio 2005和Visual Web Developer 2005也包括了它。
Visual Studio包含了用于數(shù)據(jù)庫(kù)管理的工具,例如數(shù)據(jù)庫(kù)瀏覽器(Database Explorer)和查詢構(gòu)造器(Query Builder),你可以使用它們來(lái)管理SQL Server Express數(shù)據(jù)庫(kù)。Visual Studio還支持一種新的基于文件的數(shù)據(jù)庫(kù),用于建立SQL Server Express數(shù)據(jù)庫(kù)并把它作為項(xiàng)目的一部分。同時(shí),Visual Studio 2005 和SQL Server 2005 Express為建立和部署數(shù)據(jù)驅(qū)動(dòng)的Web應(yīng)用程序提供了完整的解決方案,包括下面一些特性:
· 數(shù)據(jù)庫(kù)項(xiàng)目數(shù)據(jù)項(xiàng)
· 本地?cái)?shù)據(jù)庫(kù)連接
· 數(shù)據(jù)庫(kù)瀏覽器管理
· 相對(duì)路徑連接字符串
· XCopy部署支持
· 集成的調(diào)試支持
本文描述Visual Studio 2005中的基于文件的數(shù)據(jù)庫(kù)方式和設(shè)計(jì)器如何建立和使用這些數(shù)據(jù)庫(kù)。
Visual Web Developer和數(shù)據(jù)
Visual Web Developer為Web應(yīng)用程序使用數(shù)據(jù)庫(kù)提供了大量的工具。你可以使用數(shù)據(jù)庫(kù)瀏覽器輕易地連接到數(shù)據(jù)庫(kù)并建立或查看數(shù)據(jù)庫(kù)關(guān)系圖或大綱(schema)。你還可以使用查詢構(gòu)造器對(duì)話框和查詢結(jié)果表格來(lái)查詢數(shù)據(jù)庫(kù)和進(jìn)行數(shù)據(jù)填充。建立新數(shù)據(jù)庫(kù)(使用本地文件)也是作為項(xiàng)目數(shù)據(jù)項(xiàng)提供的。
一旦在Visual Web Developer中連接了數(shù)據(jù)庫(kù),就可以把數(shù)據(jù)庫(kù)表直接拖放到頁(yè)面上,以建立數(shù)據(jù)綁定的GridView控件。Visual Web Developer自動(dòng)地建立一個(gè)關(guān)聯(lián)的數(shù)據(jù)源控件,并根據(jù)數(shù)據(jù)表來(lái)配置它的選擇、更新、插入和刪除操作。這種快捷操作為你節(jié)省了手動(dòng)建立數(shù)據(jù)源所需的大量工作,你也可以輕易地根據(jù)需要,用適合的數(shù)據(jù)綁定控件代替GridView。
本地和服務(wù)器數(shù)據(jù)庫(kù)
你可能已經(jīng)熟悉了基于服務(wù)器的數(shù)據(jù)庫(kù)和連接字符串。在這種情況下,數(shù)據(jù)庫(kù)服務(wù)器(例如SQL Server 2005)把數(shù)據(jù)庫(kù)名稱與服務(wù)器所維護(hù)的數(shù)據(jù)庫(kù)文件相關(guān)聯(lián)。你可以通過(guò)指定服務(wù)器名稱、數(shù)據(jù)庫(kù)名稱和憑證來(lái)連接到基于服務(wù)器的數(shù)據(jù)庫(kù),例如:
- "server=(local)\SQLExpress;database=Pubs;
- Integrated Security=true"
但是,Visual Studio 2005還支持本地?cái)?shù)據(jù)庫(kù)的概念,它是添加到當(dāng)前Web應(yīng)用程序的App_Data目錄中的一個(gè)文件。在App_Data目錄中存儲(chǔ)數(shù)據(jù)文件是安全的,因?yàn)檫@個(gè)目錄中的內(nèi)容永遠(yuǎn)不會(huì)響應(yīng)用戶的請(qǐng)求。這個(gè)目錄也是存儲(chǔ)XML文件和其它數(shù)據(jù)存儲(chǔ)的推薦位置。本地的SQL Server Express數(shù)據(jù)庫(kù)帶有.MDF擴(kuò)展名(例如"MyDatabase.MDF"),它是SQL Server支持的標(biāo)準(zhǔn)文件格式。當(dāng)連接到服務(wù)器的時(shí)候,數(shù)據(jù)庫(kù)還有一個(gè)關(guān)聯(lián)的日志文件(例如"MyDatabase_log.LDF")。數(shù)據(jù)庫(kù)文件和日志文件的位置必須在一起。
我們可以通過(guò)使用相對(duì)路徑連接字符串把本地文件數(shù)據(jù)庫(kù)自動(dòng)地附加到SQL Server Express。相對(duì)路徑確保了應(yīng)用程序遷移到任何其它地方的時(shí)候都不會(huì)中斷數(shù)據(jù)庫(kù)連接。Web應(yīng)用程序中的相對(duì)路徑連接字符串如下所示:
- "server=(local)\SQLExpress;AttachDbFileName=
- |DataDirectory|MyDatabase.mdf;Integrated
- Security=true;User Instance=true"
上面的連接字符串還有兩個(gè)額外的屬性。AttachDbFileName屬性指定連接打開(kāi)的時(shí)候動(dòng)態(tài)附加到服務(wù)器上的數(shù)據(jù)庫(kù)文件的位置。盡管這個(gè)屬性可以接受數(shù)據(jù)庫(kù)的完整路徑(例如使用|DataDirectory|語(yǔ)法),但是在運(yùn)行時(shí)這個(gè)路徑會(huì)被應(yīng)用程序的App_Data目錄所代替。這也保證了應(yīng)用程序遷移到其它位置的時(shí)候連接不會(huì)中斷。第二個(gè)屬性是User Instance=true,它指定SQL Server Express附加數(shù)據(jù)庫(kù)的方式。在這種情況下,SQL Server Express為了把數(shù)據(jù)庫(kù)附加到新的實(shí)例,建立一個(gè)新的進(jìn)程,在打開(kāi)連接的用戶身份下運(yùn)行。在ASP.NET應(yīng)用程序中,這個(gè)用戶是本地的ASPNET帳號(hào)或默認(rèn)的Network Service,這依賴于操作系統(tǒng)。為了安全地附加非系統(tǒng)管理員帳號(hào)(例如ASP.NET帳號(hào))提供的數(shù)據(jù)庫(kù)文件,建立一個(gè)獨(dú)立的SQL Server用戶實(shí)例是必要的。
請(qǐng)注意:由于在默認(rèn)情況下,所有的ASP.NET應(yīng)用程序運(yùn)行在同一個(gè)進(jìn)程下,因此所有的應(yīng)用程序會(huì)把本地?cái)?shù)據(jù)庫(kù)附加到同一個(gè)SQL Server Express實(shí)例。這意味著不管應(yīng)用程序最初附加的數(shù)據(jù)庫(kù)是哪一個(gè),所有的應(yīng)用程序?qū)Ω郊拥竭@個(gè)實(shí)例的所有數(shù)據(jù)庫(kù)都擁有相同的訪問(wèn)權(quán)限。為了隔離不同的應(yīng)用程序,你必須讓每個(gè)應(yīng)用程序運(yùn)行在不同的工作進(jìn)程或應(yīng)用程序池(在IIS 6中)中。由于這個(gè)原因,本地SQL Server數(shù)據(jù)庫(kù)主要是為了方便開(kāi)發(fā),而不是用于代替共享主機(jī)環(huán)境下的基于服務(wù)器的數(shù)據(jù)庫(kù)。
另外一個(gè)要點(diǎn)是,不允許兩個(gè)用戶同時(shí)連接到一個(gè)本地?cái)?shù)據(jù)庫(kù)。在Visual Studio中設(shè)計(jì)應(yīng)用程序的時(shí)候,設(shè)計(jì)器自動(dòng)地釋放連接,以保證Visual Studio和ASP.NET能夠共享數(shù)據(jù)庫(kù)文件(例如在設(shè)計(jì)器中調(diào)試運(yùn)行中的應(yīng)用程序)。
建立本地?cái)?shù)據(jù)庫(kù)
你可以輕易地在Visual Studio的Web應(yīng)用程序項(xiàng)目中建立本地?cái)?shù)據(jù)庫(kù)。由于Visual Studio安裝了SQL Server Express,你可以使用下面的步驟來(lái)建立一個(gè)本地?cái)?shù)據(jù)庫(kù)、添加數(shù)據(jù)表并填充數(shù)據(jù)。
建立本地?cái)?shù)據(jù)庫(kù):
1. 右鍵點(diǎn)擊解決方案瀏覽器并選擇"添加新項(xiàng)…"選項(xiàng)。
2. 選擇"SQL數(shù)據(jù)庫(kù)"項(xiàng)并指定一個(gè)文件名,例如"Database.mdf"。
3. Visual Studio提示把這個(gè)文件添加到App_Data目錄中。點(diǎn)擊"是"。
4. Visual Studio添加這個(gè)文件并自動(dòng)地使用數(shù)據(jù)庫(kù)瀏覽器連接到這個(gè)數(shù)據(jù)庫(kù)。
給本地?cái)?shù)據(jù)庫(kù)添加數(shù)據(jù)表:
1. 右鍵點(diǎn)擊數(shù)據(jù)庫(kù)瀏覽器中的Tables(數(shù)據(jù)表)節(jié)點(diǎn)并選擇"添加新表"選項(xiàng)。
2. 輸入數(shù)據(jù)庫(kù)中列的名稱和類型,可以選擇在屬性表格中設(shè)置其它一些列屬性。為了建立示例Contacts數(shù)據(jù)庫(kù),請(qǐng)遵循下面的步驟。
3. 把第一列的名稱設(shè)置為"ContactID",數(shù)據(jù)類型設(shè)置為"int"。取消"允許空"檢查框的選中狀態(tài)。
4. 右鍵點(diǎn)擊ContactID列左邊的灰色方塊并選擇"設(shè)置為主健"選項(xiàng)。
5. 在下方的"列屬性"表格中,展開(kāi)"標(biāo)識(shí)符規(guī)范"節(jié)點(diǎn)并把"是否為標(biāo)識(shí)符"設(shè)置為"是"。
6. 把第二列的名稱設(shè)置為"ContactName",數(shù)據(jù)類型設(shè)置為"varchar(50)"。讓"允許空"檢查框保持選中狀態(tài)。
7. 按下Ctrl-S保存表并把表名設(shè)置為"Contacts"。點(diǎn)擊OK保存表。
8. 關(guān)閉表定義窗口。
用數(shù)據(jù)填充表:
1. 右鍵點(diǎn)擊數(shù)據(jù)庫(kù)瀏覽器中的數(shù)據(jù)表節(jié)點(diǎn)(例如"Contacts")并選擇"顯示表數(shù)據(jù)"選項(xiàng)。
2. 在顯示的表格中輸入數(shù)據(jù)表行的數(shù)據(jù)。如果使用上面的Contacts示例,你可以在ContactName列中輸入值,數(shù)據(jù)庫(kù)會(huì)自動(dòng)地生成相應(yīng)的ContactID值。
3. 關(guān)閉表格窗口。
#p#
綁定到本地?cái)?shù)據(jù)庫(kù)
為了綁定到本地?cái)?shù)據(jù)庫(kù),你需要使用相對(duì)路徑連接來(lái)配置ASP.NET數(shù)據(jù)源控件,以連接到該文件。要把一個(gè)SQL Server Express數(shù)據(jù)庫(kù)簡(jiǎn)單地綁定到SqlDataSource和GridView控件,可以使用下面的步驟:
1. 雙擊解決方案瀏覽器中的一個(gè)頁(yè)面(例如"Default.aspx")。Visual Studio會(huì)打開(kāi)這個(gè)頁(yè)面。
2. 選擇頁(yè)面窗口底部的"設(shè)計(jì)視圖"標(biāo)簽切換到設(shè)計(jì)視圖。
3. 雙擊解決方案瀏覽器中的數(shù)據(jù)庫(kù)文件(例如"Database.mdf")。Visual Studio為連接打開(kāi)數(shù)據(jù)庫(kù)瀏覽器。
4. 展開(kāi)Tables節(jié)點(diǎn)以顯示數(shù)據(jù)庫(kù)中的表。
5. 把數(shù)據(jù)庫(kù)瀏覽器中的表拖放到設(shè)計(jì)視圖中的那個(gè)打開(kāi)的頁(yè)面中。Visual Studio建立一個(gè)綁定到SqlDataSource控件的GridView。
6. 展開(kāi)GridView控件的"智能事務(wù)面板",選中分頁(yè)、排序和編輯。
7. 按Ctrl-F5運(yùn)行頁(yè)面(沒(méi)有調(diào)試)。
下面的例子顯示了一個(gè)連接到本地?cái)?shù)據(jù)庫(kù)的GridView和SqlDataSource控件。為了運(yùn)行這個(gè)示例,ASP.NET進(jìn)程帳號(hào)必須擁有~/App_Data目錄中的MDF和LDF文件的讀/寫權(quán)限。這個(gè)權(quán)限設(shè)置過(guò)程如下:
1. 在Windows瀏覽器中選中~/App_Data/Database.MDF文件并選擇"屬性"。
2. 選擇"安全"標(biāo)簽并點(diǎn)擊"添加"。
3. 點(diǎn)擊"位置…",選擇你的計(jì)算機(jī)名(在列表頂部),并點(diǎn)擊"確定"。
4. 在對(duì)象名稱文本區(qū),輸入ASP.NET進(jìn)程帳號(hào)的名稱。在默認(rèn)情況下,IIS 6.0中的名稱是"Network Service",IIS 5. x中的是"ASPNET"。
5. 在"允許"列中選中"讀"和"寫"并點(diǎn)擊"確定"。
6. 如果App_Data目錄中存在LDF文件,就需要重復(fù)上述步驟,設(shè)置LDF文件的屬性。
如果你使用Visual Web Developer在本地計(jì)算機(jī)上建立應(yīng)用程序,那么在默認(rèn)情況下,你是擁有App_Data目錄的上述權(quán)限的。如果某個(gè)數(shù)據(jù)庫(kù)文件在被附加之后需要變更權(quán)限,你必須在新權(quán)限生效之前首先關(guān)閉應(yīng)用程序域(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 〉
部署本地?cái)?shù)據(jù)庫(kù)
本地?cái)?shù)據(jù)庫(kù)文件的優(yōu)勢(shì)之一在于它可以伴隨應(yīng)用程序、作為應(yīng)用程序的一部分遷移到其它位置或其它計(jì)算機(jī)(當(dāng)然該計(jì)算機(jī)也必須運(yùn)行SQL Server Express)。在移動(dòng)數(shù)據(jù)庫(kù)的時(shí)候,該文件必須處于解除鎖定(unlocked)狀態(tài)。在設(shè)計(jì)器或應(yīng)用程序連接到數(shù)據(jù)庫(kù)的時(shí)候,文件會(huì)處于鎖定狀態(tài)。為了解除鎖定,數(shù)據(jù)庫(kù)的所有活動(dòng)連接都必須被關(guān)閉。你可以使用下面的技術(shù)來(lái)關(guān)閉數(shù)據(jù)庫(kù)的連接:
· 如果ASP.NET已經(jīng)打開(kāi)了連接,你可以通過(guò)給Web應(yīng)用程序根目錄添加一個(gè)"app_offline.htm"文件來(lái)關(guān)閉應(yīng)用程序域。它的作用就是關(guān)閉應(yīng)用程序域(而不是進(jìn)程)并把所有的應(yīng)用程序請(qǐng)求重定向(redirect)到這個(gè)文件(返回404響應(yīng)代碼)。如果要重新啟動(dòng)應(yīng)用程序,只需要?jiǎng)h除這個(gè)文件。請(qǐng)注意,簡(jiǎn)單地在頁(yè)面代碼中的關(guān)閉連接是不會(huì)釋放文件鎖的,因?yàn)樵谀J(rèn)情況下,ADO.NET連接池會(huì)保留活動(dòng)的連接。
Visual Web Developer提供了Copy Web特性,它可以使用xcopy、FTP或FrontPage服務(wù)器擴(kuò)展把應(yīng)用程序文件從工作目錄復(fù)制到目標(biāo)服務(wù)器。目標(biāo)計(jì)算機(jī)可以是本地的或遠(yuǎn)程的。從Visual Studio菜單條中選擇"Web站點(diǎn)>復(fù)制Web站點(diǎn)…"就可以調(diào)用Copy Web特性了。
盡管你可以使用Copy Web或簡(jiǎn)單的xcopy或FTP操作來(lái)移動(dòng)數(shù)據(jù)庫(kù),但是為了讓應(yīng)用程序繼續(xù)工作,目標(biāo)計(jì)算機(jī)必須運(yùn)行SQL Server Express(在同一個(gè)實(shí)例名下)。前面我們提到,由于ASP.NET運(yùn)行的所有應(yīng)用程序都連接到同一個(gè)SQL實(shí)例,所以目標(biāo)計(jì)算機(jī)上的所有應(yīng)用程序必須彼此信任。如果一個(gè)應(yīng)用程序不能看到其它應(yīng)用程序的數(shù)據(jù)庫(kù),那么我們推薦用基于服務(wù)器的方法(使用SQL認(rèn)證或其它分離技術(shù))代替本地?cái)?shù)據(jù)庫(kù)。如果你把SQL Server Express作為開(kāi)發(fā)工具,那么你需要把SQL Server Express數(shù)據(jù)庫(kù)內(nèi)容作為產(chǎn)品部署的一部分復(fù)制給客戶。
【編輯推薦】