下載 JumpPart2Sample.msi。(請注意,在示例文件中,程序員的注釋使用的是英文,本文中將其譯為中文是為了便於讀者理解。)
數據表定義了如何在數據庫中存儲數據,但沒有說明如何存取數據。我們還需要了解讀寫記錄以便從表中再次調用選定行和列的詳細信息。開發人員通常會在其代碼中編寫一些特殊的查詢語句,用於讀寫數據。這不僅會導致效率低下,還會帶來安全性問題。在本應用中,所有數據存取工作都將通過 SQL Server 存儲過程(stored procedures,有時稱作“stored procs”或“sprocs”)來處理。使用存儲過程可以提高解決方案的性能並使之更安全。此外,使用存儲過程可以增加數據層的抽象級別,從而保護解決方案的其他部分不受小的數據布局和格式變化帶來的影響。這樣可使您的解決方案更可靠,更易於維護。
我們經常會看到如下所示的文章和代碼示例:
Private Function GetSomeData(ByVal ID As Integer) As SqlDataReader
Dim strSQL As String
strSQL = "SELECT * FROM MyTable WHERE ID=" & ID.ToString()
cd = New SqlCommand
With cd
.CommandText = strSQL
.CommandType = CommandType.Text
.Connection = cn
.Connection.Open()
Return .ExecuteReader(CommandBehavior.CloseConnection)
End With
End Function
上述代碼不符合要求的原因有以下幾個。首先,如果將 SQL 查詢語句嵌套在代碼中,那麼只要數據層發生任何變化,都必須編輯並重新編譯代碼層。這樣就會帶來諸多不便。還可能會導致其他錯誤,而且通常會造成數據服務和代碼之間的混亂。
其次,如果使用不經過輸入驗證的字符串連接 ("...WHERE ID=" & ID.ToString()),將可能使您的應用程序暴露在黑客的攻擊之下。更重要的是,這樣就會為惡意用戶提供了在您的代碼中添加其他 SQL 關鍵字的機會。例如,根據您的輸入模式,惡意用戶不僅可以輸入 13 或 21 作為有效的表 ID,還可以輸入 13; DELETE FROM USERS 或其他可能會帶來危害的語句。完善的輸入驗證可以保護您的系統免受大多數 SQL 插入代碼的攻擊,所以最好將所有內置的 SQL 語句完全刪除,使攻擊者很難濫用您的應用程序數據。
最後,內置 SQL 語句的執行速度要比存儲過程慢得多。創建存儲過程並將其存儲到數據庫中時,SQL Server 會對其文本進行評估並以優化的形式進行存儲,從而使之更容易在運行時為 SQL Server 所用。如果使用內置的特殊查詢語句,就必須在每次運行該代碼之前進行這種評估。對於那些供大量用戶使用的應用程序而言,每分鐘就可能需要對同一查詢語句進行數百次評估。
相反,存儲過程可以保持代碼的簡潔明了,可以提供額外的安全保護,並能提高解決方案的性能。這些都是摒棄內置查詢語句而使用存儲過程的原因。
將存儲過程添加到 Visual Studio .NET 數據庫項目中
使用 Visual Studio .NET 2003 創建存儲過程非常簡單。首先,您需要打開一個數據庫項目。這一操作已在《使用VS.NET2003創建數據庫圖》中完成。然後,您可以使用代碼模板創建存儲過程,也可以針對 Server Explorer(服務器資源管理器)窗口中連接的數據庫,使用 Visual Studio .NET 2003 直接編輯新的存儲過程。本文重點介紹如何針對連接的數據庫服務器直接編輯存儲過程。稍後會介紹如何為以後的遠程服務器安裝生成所有結果腳本。
介紹使用 Visual Studio .NET 2003 編寫存儲過程的機制之前,還要重點強調一下與創建可靠的存儲過程相關的幾個一般問題。首先,最好將創建和執行存儲過程的整個過程看作是多層應用程序模型的一個成熟成員。存儲過程提供了一種對您的數據存取進行編程的方法。這樣,您可以更好地控制整個解決方案並提高其效率。也就是說,應將存儲過程集合看作是應用程序中一個獨立的層。優秀的數據存取策略應允許存儲過程作為獨立的組件而存在。也就是說,存儲過程層中需要具備安全性、錯誤處理以及其他構成優秀組件層的詳細內容。更重要的是,應像在其他高級編程環境中那樣訪問 T-SQL 語言,而不是僅僅將其作為一種生成數據庫查詢的方式。
注意:現在,我懷疑有些讀者可能在想他們並不打算對 SQL Server 進行編程,或者認為這項工作最好留給那些 DBA 們來完成。雖然具備數據庫管理員經驗會有所幫助,但並一定非要成為火箭科學家(這裡指技藝高超的編程專家)才能很好地完成 SQL Server 編程工作。像其他語言一樣,這種語言也需要花費一定的時間並通過一定的實踐才能熟練掌握,在這一點上它與其他語言並沒有太大的不同。如果您能夠在 Microsoft Visual Basic® .NET 中編程,也就能夠在 T-SQL 中編程。