本文僅代表作者個人觀點(diǎn),正確與否請讀者自行研究!
原文地址:http://www.microsoft.com/china/msdn/library/dnaspp/html/aspnet-jumpinto-part2.asp
下面是一個更復(fù)雜的存儲過程。此過程用于從數(shù)據(jù)庫中檢索單條主題記錄。您會發(fā)現(xiàn)一些附加項(xiàng),包括輸入?yún)?shù)、返回特定值的輸出參數(shù),以及檢查輸入?yún)?shù)并在需要時返回錯誤的某些程序代碼。 CREATE PROCEDURE TopicsGetItem
(
@AdminCode char(3),
@ID int,
@Title varchar(30) OUTPUT,
@Description varchar(500) OUTPUT
)
AS
SET NOCOUNT ON -- 不返回受影響行的值
-- 確保是一個 Admin 用戶
IF @AdminCode<>'adm'
BEGIN
RETURN 100 -- 無效 admin 錯誤
END
-- 檢查記錄是否存在
IF (SELECT Count(ID) FROM Topics WHERE ID=@ID)=0
BEGIN
RETURN 101 --- 無效 ID 代碼
END
-- 繼續(xù)執(zhí)行并返回該記錄
SELECT
@Title=Title,
@Description=Description
FROM
Topics
WHERE
ID=@ID
-- 返回錯誤,如果成功則返回 0
RETURN @@ERROR
在本示例中,還有幾點(diǎn)需要指出。首先,您會在存儲過程頂端看到一個參數(shù)列表。除前兩個參數(shù)外,其他參數(shù)均被標(biāo)記為 OUTPUT 參數(shù)。這些參數(shù)用于返回選定記錄的值。使用一條記錄的返回值要比返回帶有所有字段的記錄集合更為高效。
其次,您會發(fā)現(xiàn)用于檢查 @AdminCode 參數(shù)值的 T-SQL 數(shù)據(jù)塊,以確保傳遞正確的代碼。如果傳遞的代碼不正確,則傳遞返回代碼 100 并停止執(zhí)行該過程。再其次,您會發(fā)現(xiàn)檢查 @ID 參數(shù),以確保其代表一條現(xiàn)有記錄。如果不是現(xiàn)有記錄,則傳送返回代碼 101 并終止執(zhí)行。最后,如果輸入變量都有效,存儲過程將嘗試選擇記錄并返回相應(yīng)的值。如果此時發(fā)生任何錯誤,將由該過程的最后一行代碼進(jìn)行處理。
注意:通常情況下,最好將自定義錯誤代碼及其含義保存在數(shù)據(jù)庫中的一個單獨(dú)的表格中,或保存在解決方案可以訪問的文本文件中。這樣就可以輕松更新這些錯誤代碼,并與解決方案中的其他子系統(tǒng)共享。因?yàn)檫@只是一個短小的示例,其中只使用了兩個錯誤代碼,所以我決定創(chuàng)建一個包含大量代碼和消息的文檔,以供其他子系統(tǒng)參考。
該解決方案中包含的存儲過程超過 25 個。本文僅舉一例進(jìn)行說明,其他代碼可以通過本文開始處的鏈接進(jìn)行下載。最后這個示例使用一個自定義的內(nèi)置標(biāo)量函數(shù)。
使用自定義標(biāo)量函數(shù)
有時,單獨(dú)一個存儲過程不足以解決問題。例如,我們的用戶方案中就有一個方案要求列出某個問題的解答數(shù)目。解決此問題的方法之一是生成一個對問題的解答進(jìn)行計數(shù)的子查詢。另外一種方法是生成一個自定義函數(shù),返回標(biāo)量值并將其包含在問題查詢中。這種方法還有一個好處,那就是我們可以在其他存儲過程中再次使用該標(biāo)量函數(shù)。
添加自定義函數(shù)的操作類似于添加存儲過程。在 Server Explorer(服務(wù)器資源管理器)樹中,在選定數(shù)據(jù)庫的 Functions(函數(shù))節(jié)點(diǎn)上單擊鼠標(biāo)右鍵,然后從上下文相關(guān)菜單中選擇 New Scalar-Valued Function(新建標(biāo)量值函數(shù))。然后在編輯器中編輯該文檔,并像保存存儲過程那樣保存該文檔。
以下是自定義函數(shù)的代碼: CREATE FUNCTION dbo.fn_QuestionsGetResponseCount
(
@ID int
)
RETURNS int
AS
BEGIN
DECLARE @ResponseCount int
Set @ResponseCount =
(
SELECT
COUNT(Responses.ID)
FROM
Responses
WHERE
Responses.QuestionID=@ID
)
RETURN @ResponseCount
END
以下是使用自定義函數(shù)的存儲過程: CREATE PROCEDURE QuestionsGetCountWithNoResponses
(
@Total int OUTPUT
)
AS
SET NOCOUNT ON -- 不返回受影響行的值
SELECT
@Total=Count(ID)
FROM
Questions
WHERE
dbo.fn_QuestionsGetResponseCount(Questions.ID)=0
RETURN @@ERROR
了解如何編寫存儲過程和自定義函數(shù)之后,我們還將討論使用 Visual Studio .NET 2003 創(chuàng)建數(shù)據(jù)層時的另一個問題,即安全性問題。
IIS、ASP.NET 和 SQL Server 的安全性問題
SQL Server、Internet 信息服務(wù)器和 ASP.NET 引擎都提供了堅(jiān)實(shí)可靠的安全模型,它們可以很好地在一起協(xié)同工作。為了保證用戶數(shù)據(jù)和應(yīng)用程序的安全,Microsoft 還為每項(xiàng)服務(wù)的默認(rèn)設(shè)置設(shè)置了相當(dāng)?shù)偷闹怠4蠖鄶?shù)開發(fā)人員面臨的挑戰(zhàn)是如何使用 SQL Server、IIS 和 ASP.NET 在應(yīng)用程序和數(shù)據(jù)之間設(shè)置適當(dāng)?shù)男湃渭墑e,而不會留下可被別人輕易攻入的安全漏洞。由于涉及三類服務(wù)(SQL Server、IIS 和 ASP.NET),所以需要采取三個關(guān)鍵的步驟來確保解決方案的安全。本部分討論一種為 Web 應(yīng)用程序設(shè)置足夠權(quán)限和信任級別的更常用(且可靠)的方法。
注意:關(guān)于安全性和 Web 解決方案這個大主題,本系列文章難以展開較充分的討論。要更好地理解此問題和可能的解決方案,請參閱安全 ASP.NET 應(yīng)用程序的創(chuàng)建模式和實(shí)踐系列文章:驗(yàn)證、授權(quán)和安全通信。
定義 DotNetKB 自定義 IIS 用戶帳戶
保證 Web 應(yīng)用程序安全性的最安全的方法是定義一個權(quán)限有限的自定義用戶,然后對 IIS 進(jìn)行配置,使之能夠在執(zhí)行您的 Web 應(yīng)用程序時能作為自定義用戶運(yùn)行。這是相當(dāng)容易實(shí)現(xiàn)的,可以確保訪問您的 Web 應(yīng)用程序的每個訪問者都只具有您希望他們具有的權(quán)限。
第一步是生成一個新的 Windows 用戶(本例中稱為 DotNetKB),為其設(shè)置一個增強(qiáng)型密碼,然后將其添加到 Windows 來賓組 (Guest Windows Group) 中。同時,確保選中 Password never expires(密碼永不過期)和 User cannot change password(用戶不能更改密碼)復(fù)選框。這樣將生成一個權(quán)限有限的用戶,在 IIS 中運(yùn)行您的 Web 應(yīng)用程序時,您可以將其用作標(biāo)識(參見圖 7)。
圖 7:生成的權(quán)限有限的用戶
然后,調(diào)用 Internet 信息服務(wù)器管理員并選擇承載這些網(wǎng)頁的 Web 應(yīng)用程序。在本例中,您可以選擇承載前文所生成的測試頁的 Web 應(yīng)用程序 (DotNetKB_WebSite)。在樹視圖中的 Web 應(yīng)用程序上單擊鼠標(biāo)右鍵,然后從上下文相關(guān)菜單中選擇 Properties...(屬性...)。然后選擇 Directory Security(目錄安全性)并單擊該對話框 Anonymous access and authentication control(匿名訪問和驗(yàn)證控制)部分中的 Edit(編輯)按鈕。最后,輸入自定義用戶名 (DotNetKB),取消選擇 Allow IIS to control password(允許 IIS 控制密碼)復(fù)選框,并輸入該自定義用戶帳戶的密碼。完成所有這些工作之后,單擊 OK(確定)按鈕,將這些更改保存到 IIS 配置數(shù)據(jù)庫中(參見圖 8)。
圖 8:Authentication Methods(驗(yàn)證方法)對話框
此時,IIS 將在一個權(quán)限有限的自定義帳戶下運(yùn)行。任何訪問者訪問您應(yīng)用程序的網(wǎng)頁時,都將以這個自定義用戶身份運(yùn)行,且只具有該自定義用戶的驗(yàn)證權(quán)限。
授權(quán) DotNetKB 用戶帳戶訪問 SQL Server
然后,您需要為該自定義用戶授予訪問數(shù)據(jù)庫 (DotNetKB) 的相應(yīng)權(quán)限。為此,您可以使用 Microsoft SQL Server 企業(yè)管理器或編寫一個自定義腳本,以創(chuàng)建一個這樣的用戶并授予其訪問特定對象的權(quán)限。本文介紹如何使用 SQL Server 企業(yè)管理器完成此操作。您還可以從后文中看到一個腳本示例。
注意:盡管 Visual Studio .NET 2003 具有與 SQL Server 兼容的許多強(qiáng)大的集成功能,但也不允許從 Visual Studio .NET 2003 中輕松管理用戶和用戶權(quán)限。在大型的組織和團(tuán)隊(duì)中,這些高級任務(wù)通常由數(shù)據(jù)庫管理員完成。
因此,啟動 SQL Server 企業(yè)管理器之后,您可以按照以下步驟將自定義用戶 (DotNetKB) 添加數(shù)據(jù)庫中(參見圖 9):
然后,您需要為 DotNetKB 數(shù)據(jù)庫中的所有存儲過程和自定義函數(shù)添加執(zhí)行權(quán)限。為此,您只需為 public(公共)角色授予權(quán)限。您可以將權(quán)限授予 DotNetKB 用戶,這樣將使以后的登錄(當(dāng)這些用戶獲得訪問 DotNetKB 的權(quán)限時)更容易執(zhí)行存儲過程,而不需要為每個用戶添加新的權(quán)限。
下面是為 DotNetKB 數(shù)據(jù)庫中的存儲過程和函數(shù)授予執(zhí)行權(quán)限的步驟:
- 突出顯示樹視圖中 DotNetKB 數(shù)據(jù)庫下的 Users(用戶)節(jié)點(diǎn),以顯示此數(shù)據(jù)庫的用戶列表。找到 DotNetKB 用戶并在其上雙擊,打開 Database Users Properties(數(shù)據(jù)庫用戶屬性)對話框。
- 突出顯示(選中)public(公共)角色時,單擊 Properties...(屬性...)按鈕,打開 Database Role Properties(數(shù)據(jù)庫角色屬性)對話框。然后單擊 Permissions...(權(quán)限...)按鈕,顯示數(shù)據(jù)庫對象和權(quán)限設(shè)置列表。
- 選中對話框頂部 Database role(數(shù)據(jù)庫角色)下拉列表中的 public(公共)角色之后,找到為此數(shù)據(jù)庫定義的所有存儲過程和自定義函數(shù)(可能需要展開對話框才能看到全名),并確保選中各項(xiàng)旁邊的 EXECUTE(執(zhí)行)復(fù)選框。您可能會發(fā)現(xiàn)某些系統(tǒng)對象的其他一些復(fù)選框也被選中了,請不要更改這些選項(xiàng)。
- 最后,設(shè)置所有的 EXECUTE(執(zhí)行)權(quán)限后,單擊 OK(確定)按鈕,保存更改并關(guān)閉對話框。依次單擊 OK(確定)按鈕,直到所有對話框均被關(guān)閉。
至此,您已為 IIS 創(chuàng)建了自定義用戶,并設(shè)置了該用戶在 SQL Server 中的相應(yīng)權(quán)限。現(xiàn)在,您需要在 ASP.NET Web 項(xiàng)目中進(jìn)行一個配置更改,確保 ASP.NET 使用同一個用戶帳戶執(zhí)行對 SQL Server 的所有調(diào)用。
設(shè)置您的 ASP.NET 應(yīng)用程序以模擬 DotNetKB 用戶
為 IIS 下運(yùn)行的 ASP.NET Web 應(yīng)用程序生成堅(jiān)實(shí)可靠的配置的最后一個步驟是:配置 ASP.NET Web 應(yīng)用程序,使之能夠接受來自 IIS 的 Windows 用戶標(biāo)識并能用于訪問其他操作系統(tǒng)資源。為此,您只需在 web.config 根文件中輸入一行代碼。
注意:盡管目前我們還沒有真正開發(fā)出用于承載我們的頁面的 ASP.NET Web 應(yīng)用程序,但您可以使用這些信息在生成測試頁的下一節(jié)中驗(yàn)證數(shù)據(jù)訪問層的功能。
修改后的 web.config 文件如下所示: <configuration>
<system.web>
... 其他要素 ...
<identity impersonate="true"/> <!-- 假設(shè) IIS 用戶標(biāo)識 -->
... 其他要素 ...
</system.web>
</configuration>
請注意,您只需添加 <identity> 元素并將模擬特性設(shè)置為 true(真)。不必輸入用戶帳戶或密碼,因?yàn)檫@些信息將由 IIS 提供。也就是說,即使其他人能夠讀取您的配置文件,他們也無法確定使用哪些標(biāo)識憑據(jù)來執(zhí)行您的 Web 應(yīng)用程序。
至此,您已生成了自定義用戶,并為其設(shè)置了訪問 SQL Server 和 IIS 的相應(yīng)權(quán)限。現(xiàn)在,我們來創(chuàng)建一些測試頁,確保它能夠正常工作。從這里您可以看出一切正常。
創(chuàng)建 ASP.NET 測試頁
創(chuàng)建測試頁始終是訪問 SQL Server 數(shù)據(jù)層并驗(yàn)證輸入和輸出參數(shù)是否得到正確處理的好辦法。實(shí)際上,這是確保以后的生產(chǎn)解決方案中的 ASP.NET 頁和組件能夠按照預(yù)期方式工作的唯一辦法。這對于從解決方案中的某個層調(diào)用其他層時的驗(yàn)證信任邊界和安全性問題尤其正確。
另外,在進(jìn)行測試時,請勿拘泥于創(chuàng)建生產(chǎn)類接口。您只需測試目標(biāo)方法。實(shí)際上,故意創(chuàng)建一些您不愿以之為最終生產(chǎn)解決方案的“丑陋”測試頁是一個好的策略!本文中,我創(chuàng)建了一些非常簡單的 ASP.NET 頁,其中包含一個測試記錄列表和一個用于添加、編輯和刪除測試記錄的輸入表單。
例如,以下是用于測試主題記錄的 WebForm 布局。您會發(fā)現(xiàn),它包含錯誤消息或其他消息的狀態(tài)標(biāo)簽、記錄計數(shù)標(biāo)簽、顯示記錄列表的數(shù)據(jù)網(wǎng)格、用于輸入檢索時使用的記錄 ID 的輸入框以及支持添加、編輯和刪除記錄的小表格(參見圖 10)。
圖 10:用于測試主題記錄的 WebForm 布局
在創(chuàng)建測試頁時,最好使代碼簡潔明了。我通常會為每個按鈕添加一小段代碼,以調(diào)用本地方法來處理數(shù)據(jù)庫操作。以下是 TopicTest.aspx 頁上 Get Record(獲取記錄)按鈕的代碼。 Private Sub btnGetTopic_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGetTopic.Click
Try
Dim ID As Integer = Int32.Parse(txQueryID.Text)
GetItem(ID) ' 進(jìn)行數(shù)據(jù)庫調(diào)用
txID.Text = txQueryID.Text
txTitle.Text = mTitle
txDescription.Text = mDescription
lbStatus.Text = "success!"
Catch ex As Exception
lbStatus.Text = ex.Message
End Try
End Sub
請注意,本方法中實(shí)際執(zhí)行的唯一操作是由 GetItem(ID) 方法調(diào)用處理的。它執(zhí)行數(shù)據(jù)庫調(diào)用并使用返回的值設(shè)置本地變量。以下是 GetItem 方法的代碼。請注意,它使用了大量的 SqlParameter 對象來處理輸入和輸出值。 Private Sub GetItem(ByVal ID As Integer)
Try
pr = New SqlParameter("RETURN_VALUE", SqlDbType.Int)
pr.Direction = ParameterDirection.ReturnValue
Dim pTitle As SqlParameter = New SqlParameter
With pTitle
.Direction = ParameterDirection.Output
.DbType = DbType.String
.ParameterName = "@Title"
.Size = 30
End With
Dim pDescription As SqlParameter = New SqlParameter
With pDescription
.Direction = ParameterDirection.Output
.DbType = DbType.String
.ParameterName = "@Description"
.Size = 500
End With
cd = New SqlCommand
With cd
.CommandText = "TopicsGetItem"
.CommandType = CommandType.StoredProcedure
.Parameters.Add(New SqlParameter("@AdminCode", "adm"))
.Parameters.Add(New SqlParameter("@ID", ID))
.Parameters.Add(pTitle)
.Parameters.Add(pDescription)
.Parameters.Add(pr)
.Connection = cn
.Connection.Open()
.ExecuteNonQuery()
.Connection.Close()
End With
' 檢查返回代碼
If Not pr.Value Is Nothing Then
Select Case Int32.Parse(pr.Value)
Case 100 : Throw New ApplicationException("Access violation")
Case 101 : Throw New ApplicationException("Invalid ID")
End Select
End If
' 設(shè)置返回值
mTitle = pTitle.Value.ToString()
mDescription = pDescription.Value.ToString()
Catch ex As Exception
Throw New Exception(ex.Message, ex)
End Try
End Sub
GetItem 方法的另一個重要方面是使用了返回值參數(shù)。它在前幾行代碼中進(jìn)行聲明,并在執(zhí)行存儲過程后進(jìn)行檢查。請注意,我檢查了已知錯誤代碼 100 和 101。有關(guān)其他錯誤的處理方法,我們將在以后介紹如何創(chuàng)建成熟的中間層時進(jìn)行介紹。問題在于,我要利用返回值并在需要時拋出一個自定義異常。
對于本解決方案示例,我最終生成了六個 Web 表單,并用它們測試了將近 30 個存儲過程和自定義函數(shù)。您可在本文開始部分列出的下載軟件包中找到所有這些完成的表單。
現(xiàn)在我們已經(jīng)定義了表、創(chuàng)建了存儲過程和函數(shù)并生成了 ASP.NET Web 表單,因此可以使用 Visual Studio .NET 2003 生成數(shù)據(jù)庫層的安裝腳本了。數(shù)據(jù)庫管理員(有時是您自己)可以將此腳本應(yīng)用到生產(chǎn)服務(wù)器上。
生成源代碼和安裝腳本
Visual Studio .NET 的另一個重要功能是它能夠?yàn)楝F(xiàn)有數(shù)據(jù)庫生成一個完整的生成腳本。實(shí)際上,您可以使用 Visual Studio .NET 為整個數(shù)據(jù)庫層生成源代碼(包括生成表和索引、授權(quán)、存儲過程等),還可以生成一個可用于在現(xiàn)有 SQL Server 上安裝這些數(shù)據(jù)庫對象的命令行腳本。
生成安裝腳本非常容易,它包括兩個步驟:首先,需要生成 T-SQL 腳本來創(chuàng)建數(shù)據(jù)庫對象(表、索引、過程等)。然后,生成一個針對目標(biāo) SQL Server 執(zhí)行 T-SQL 腳本的命令行腳本。
生成 T-SQL 腳本
生成安裝腳本之前,需要生成一個腳本集合,包括創(chuàng)建數(shù)據(jù)庫中的所有對象(表、索引、約束條件、用戶等)。
圖 11:生成腳本集合
以下是生成 T-SQL 腳本的步驟:
- 在 Server Explorer(服務(wù)器資源管理器)中,在選定的數(shù)據(jù)庫節(jié)點(diǎn) (DotNetKB) 上單擊鼠標(biāo)右鍵,然后從上下文相關(guān)菜單中選擇 Generate Create Script...(生成創(chuàng)建腳本...),打開 Generate Create Scripts(生成創(chuàng)建腳本)對話框。
- 在 General(常規(guī))選項(xiàng)卡上,選中 Script all objects(編寫全部對象腳本)復(fù)選框。
- 在 Formatting(格式化)選項(xiàng)卡上,選中除最后一個復(fù)選框以外的所有復(fù)選框(僅與 7.0 版腳本兼容的功能)。僅在您的目標(biāo)服務(wù)器是 SQL Server 7.0 而不是 SQL Server 2000 時,才需要最后一項(xiàng)。
- 在 Options(選項(xiàng))選項(xiàng)卡上,在 Security Scripting Options(安全性腳本選項(xiàng))部分,選中除 Script SQL Server logins(撰寫 SQL Server 登錄腳本)之外的所有選項(xiàng)。確保選中 Table Scripting Options(表腳本選項(xiàng))部分中的所有復(fù)選框。同時保留 File Format(文件格式)和 Files to Generate(生成的文件)的默認(rèn)單選按鈕。最后,當(dāng)所有設(shè)置均已設(shè)置正確時,單擊 OK(確定)按鈕開始腳本生成過程。
- 系統(tǒng)將提示您指定文件位置。默認(rèn)情況下,Visual Studio .NET 將指向現(xiàn)有數(shù)據(jù)庫項(xiàng)目中的 Create Scripts(創(chuàng)建腳本)文件夾。單擊 OK(確定)按鈕接受此默認(rèn)位置。
該過程完成后,您將獲得保存數(shù)據(jù)庫中各對象的文件列表。此腳本集合還包含了用于創(chuàng)建相應(yīng)的用戶并為其授予正確權(quán)限的腳本。您甚至可以將這些信息保存到 Visual SourceSafe 中,用于處理以后的版本問題。最后,您可以根據(jù)需要將這些文件傳送給其他人,使他們可以直接更新或更改這些文件。至此,已經(jīng)完成了數(shù)據(jù)庫層的完整源代碼。
生成安裝腳本
最后一個步驟是讓 Visual Studio .NET 2003 生成一個命令行腳本,用于讀取所有 T-SQL 腳本并根據(jù)目標(biāo) SQL Server 運(yùn)行這些腳本。為此,需要完成以下步驟。
- 在 Solution Explorer(解決方案資源管理器)中,在項(xiàng)目名稱 (DotNetKB) 上單擊鼠標(biāo)右鍵,然后從上下文相關(guān)菜單中選擇 Create Command File...(創(chuàng)建命令文件...),打開 Create Command File(創(chuàng)建命令文件)對話框。
- 如果需要,可以更新 Name of Command File(命令文件名稱)輸入框,然后選擇合適的驗(yàn)證方案(除非您需要遠(yuǎn)程連接服務(wù)器,否則請使用 Microsoft Windows? NT?)。最后,單擊 Add All(全部添加)按鈕,以便將所有 T-SQL 腳本都包含在安裝操作中。
- 然后,單擊 OK(確定)按鈕生成腳本。這樣即可將完整的腳本加載到編輯器窗口(參見圖 12)中,您可以在該窗口中檢查腳本,所做的更改將在您關(guān)閉窗口時得到保存。
圖 12:生成安裝腳本
使用此腳本和 T-SQL 文件集,現(xiàn)在您可以將新數(shù)據(jù)庫層安裝到任何您具有相應(yīng)權(quán)限的目標(biāo) SQL Server 2000 上了。
小結(jié)
本部分討論了很多內(nèi)容。包括如何使用 Visual Studio .NET 2003 創(chuàng)建數(shù)據(jù)庫項(xiàng)目,如何創(chuàng)建新數(shù)據(jù)庫以及定義表、索引、約束條件和關(guān)系的數(shù)據(jù)庫圖,還介紹了使用 Visual Studio .NET 2003 添加可以存取表中存儲的數(shù)據(jù)的存儲過程和自定義函數(shù)。通過本文的學(xué)習(xí),您還學(xué)會了如何使用自定義的 Windows 帳戶以及 IIS 和 Web 應(yīng)用程序中的 web.config 文件設(shè)置,在 SQL Server 和您的 ASP.NET 解決方案之間建立一種可靠的信任關(guān)系。本文最后還介紹了用于驗(yàn)證數(shù)據(jù)層程序設(shè)計的測試 Web 表單示例,并說明了如何生成可用于在任何目標(biāo) SQL Server 上安裝完成的這個數(shù)據(jù)層的 T-SQL 腳本和命令行腳本。
也許您已經(jīng)注意到,數(shù)據(jù)庫層的相關(guān)討論中未涉及到專家記錄的存儲和再調(diào)用過程。這是因?yàn)槲覜Q定使用 XML 文件代替它。這樣,我們可以借此機(jī)會學(xué)習(xí)如何將 XML 作為數(shù)據(jù)源,以及如何將這種數(shù)據(jù)格式與 SQL Server 數(shù)據(jù)結(jié)合起來以創(chuàng)建一個完整的解決方案。在下一部分中,我們將定義 XML 存儲格式和讀寫這種數(shù)據(jù)的組件層,還將學(xué)習(xí)有關(guān) XML 序列化以及 ASP.NET 中的內(nèi)置數(shù)據(jù)高速緩存服務(wù)的相關(guān)知識。
注意:您可以通過訪問相關(guān)的 DotNetKB(英文)Web 站點(diǎn)隨時了解此項(xiàng)目的最新信息。在 MSDN? 上發(fā)布各部分之前,我會隨時在此站點(diǎn)上張貼更新內(nèi)容、讀者意見的反饋和其他信息。
Mike Amundsen 提供培訓(xùn)、演講和咨詢服務(wù)。要了解他的詳細(xì)信息或與他聯(lián)絡(luò),請?jiān)L問他的站點(diǎn) http://amundsen.com/。此外,還可以在 http://www.amundsen.com/DotNetKB 站點(diǎn)上找到本文的更新和相關(guān)資料。
出處:Microsoft
責(zé)任編輯:cjj
上一頁 使用 SQL Server 2000 創(chuàng)建數(shù)據(jù)存儲層1 [2] 下一頁
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|