上一篇文章中,北京北大青鳥學校學術老師介紹了Visual Web Developer和數據,這篇內容將介紹本地和服務器數據庫。
北京北大青鳥學校學術老師介紹,我們已經熟悉了基于服務器的數據庫和連接字符串。在這種情況下,數據庫服務器(例如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能夠共享數據庫文件(例如在設計器中調試運行中的應用程序)。