因為Access並不真正為高效能應用程式服務,所以一個希望有多個同時串連使用者的網站必須部署一個比Access更適合的資料來源。本文將講述如何從Microsoft SQL Server(一種企業級RDMS)中擷取資料。
SQL Server完全版包括了三個部分。第一個是引擎,用於實際組織資料以及針對命令響應進行讀取和寫入操作。第二個是開發人員的工具軟體包,用於對資料庫進行操作,例如Query Analyzer和Data Transformation Services。最後一個是用於管理資料的工具,包括備份程式和複製模式。
雖然完全版對大型企業來說有著不可估量的好處,但是很多開發人員並不需要整套工具。幸運的是,Microsoft提供了一個SQL Server引擎的免費版,叫做SQL Server Express(SSE)。儘管它具有一個使用T-SQL命令來匯入模式和資料的命令列工具(osql.exe),但是它還不包含在SQL Server完全版中具有的豐富圖形化的工具。不過,可以方便地使用Visual Studio或者Visual Web Developer來使用SSE開發資料庫。SSE有一個限制,即只處理本地的串連(不可能在Web伺服器之外的不同機器上運行SSE)。對於具有某些嗜好的人以及學生的Web網站來說,SSE是一個非常適合的選擇。可能會使用基於SQL Server 2000的MSDE,而SSE則基於SQL Server的Yukon版。
除非有另外特別的說明,這裡所介紹的所有技術均可應用於SQL Server的三種形式(完全版產品、SSE和MSDE),因此,通用術語SQL Server包含了這三種形式。
因為SSE只是一個引擎而並沒有內建的開發工具(到2004年),所以必須使用其他的工具來建立、修改或者填充資料庫。為此我們將要使用的主要工具是Visual Studio或者Visual Web Developer,其中提供了Database Explorer作為其介面的一部分。請注意Database Exporer可以更改本機資料庫中的資料和模式,但是它只能更改遠端資料庫中的資料(而不是結構)。在Visual Studio中,Database Explorer被稱為Server Explorer,因為它包括了一些處理非資料庫伺服器的附加功能。我們還將在本書的開端簡單地使用osql.exe命令列工具來匯入將在本書通篇使用的初始資料庫。修改資料庫結構的第三種方式是開啟Access,然後在SSE資料庫中連結一個外部表格。
使用SQL Server需要熟悉一些詞彙。SQL Server安裝在一台稱為伺服器(server)的機器上,並且可以通過其機器名來引用。如果SQL Server與請求軟體位於同一台機器上,那麼這台機器可以用(local)來引用。引擎可以在一台機器上安裝多次,每一次安裝稱為一個執行個體(instance)。SSE安裝一個名為(local)\SQLExpress的執行個體。在一個執行個體內,可以建立資料庫(database)。資料庫有一些具有欄位(field)和記錄(record)的表(table)。資料庫還有供資料使用者使用的一組表、欄位和約束,稱為視圖(view)。預存程序(stored procedures,SPROC)可以對資料執行任務。一個SQL Server執行個體自動安裝了一個使用者名稱為sa的賬戶,當對使用者使用SQL Server認證時,這個賬戶具有對所有對象進行所有動作的許可權。在使用Windows認證(也稱為混合認證)的時候,登入進Windows的使用者也同時登入進了SSE。
使用SQL Server資料庫之前的準備
花時間在研究資料庫上將減少您設計使用資料的頁面時的錯誤。在編寫使用SQL Server的頁面之前,請檢查您是否已掌握了如下幾類資訊:
· 伺服器、執行個體和資料庫名稱—— 確認伺服器名稱、執行個體和資料庫名稱的確切拼字。如果在伺服器上只有一個完全版SQL Server的執行個體,那就不需要使用執行個體名了。但是即使在伺服器上只有一個SSE的執行個體,也必須用MyServer\SQLExpress來顯式地引用。請明確是將要測試實際資料還是測試資料庫的部署備份。
· 安全資訊—— 您需要知道您的使用者ID和密碼,以便對開發資料庫的訪問進行認證。同樣地,請檢查SSE是使用Windows認證還是SQL認證(第1章中的安裝曾說明SSE應該使用Windows認證)。
· 資料庫模式—— 理解資料庫的模式。獲得表和欄位名、自動產生或鎖定的欄位、相關性以及約束的確切拼字。仔細注意對象名稱中的底線和空格。從資料庫管理員那裡查到是直接使用表還是使用視圖或者預存程序(SPROC)。使用後者將可能需要特殊資料類型的參數。用來檢查這些中繼資料的SQL文法羅列在本章的後面。
· 測試SQL語句(可選)—— 您可能會懷疑SQL語句的文法或者邏輯。您將會發現測試語句的有效方法是使用諸如SQL的Query Analyzer的開發工具,而不是在這些語句第一次出現在ASPX頁面上時才測試。
連接字串
AccessDataSource控制項和SqlDataSource控制項之間文法的主要區別在於使用資料庫的方式各異。對MDB來說,我們只需提供檔案名稱和路徑名,而SqlDataSource則使用包含了伺服器名稱、資料庫名稱和登入資訊的連接字串名。連接字串的文法區別於我們在Visual Basic或者C#中所熟悉的文法,並且也是很多學生犯錯誤的原因。一個典型的連接字串如下:
ConnectionString="Server=MyServer; Database=MyDatabase;User ID=MyID; Password=MyPass"
多行的連接字串的格式能夠提高可讀性,如下所示:
ConnectionString="
Server=MyServer;
Database=MyDatabase;
User ID = MyID;
Password=MyPass"
首先,我們來討論文法。原始碼中整個字串處於雙引號之中。當在VWD的屬性視窗指定連接字串時,您不需要引號,VWD將會自動添加。在引號中間是一些格式如Criteria=value的成對資訊。分號將這些資訊分隔開。請注意,值不需要使用引號。同樣,請注意即使判句中包含空格(例如User ID),它們也不需要使用引號或者方括弧。這種文法理解起來並不困難,但是因為與VB、C#和SQL語言不同,所以錯誤常常出現。現在讓我們花一點時間將這個字串分解開來。
在這個連接字串中有兩種值:資料庫標識符(伺服器、執行個體和資料庫)和安全值(使用者ID、密碼和安裝設定)。資料庫標識符以伺服器值開始,這個值是運行SQL Server的機器的網路名稱。(在XP中機器名稱的獲得可以通過Start->My Computer;單擊右鍵並選擇Properties->Computer Name tab->Full Computer Name。在Windows 2000中,可以在案頭的My Computer上單擊右鍵->Properties->Network Indentification)。如果知道資料庫伺服器與ASP.NET啟動並執行Web 服務器使用相同的機器,那麼還可以將伺服器名稱指定為(local)來表明伺服器就是ASP.NET頁面啟動並執行本地機器。可以用Instance=MyInstance來添加執行個體。更一般的情況是,使用MyServer \My- Instance或者(local)\MyInstance來添加執行個體至伺服器名稱。可能還會看到使用句點(句號)來表示本地機器,例如.\SQLExpress。
在預設情況下,SSE安裝自己的執行個體。單獨引用(local)將導致失敗。必須使用(local)\SQLExpress來引用SSE。
安全設定將在本章稍後討論。現在,我們來瞭解Windows Authentication,使用屬性IntegratedTrusted_connection=true而不是使用者ID和密碼屬性。SQL認證需要兩個值:user=MyUserName;password=MyPassword,其中MyUserName和MyPassword將被您的認證代替。本文使用的是Windows認證。
如果您熟悉ASP早期版本,那麼也許對提供者感到疑惑。SqlDataSource的預設提供者是.NET Framework Data Provider for SQL Server。所以在本章中不需要指定提供者。下一章將會討論為其他資料庫指定非預設的提供者。