導(dǎo)言:
數(shù)據(jù)庫(kù),比如Microsoft's SQL Server 2005使用Transact-Structured Query Language (T-SQL)來(lái)插入、修改、檢索數(shù)據(jù).絕大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)都包含constructs來(lái)對(duì)一系列的SQL statements進(jìn)行分組,這些statements可以作為單獨(dú)的單元來(lái)執(zhí)行.存儲(chǔ)過(guò)程就是一個(gè)例子,另一個(gè)例子是用戶(hù)自定義函數(shù)(UDFs), 我們將在第9步進(jìn)行詳細(xì)的探討.
SQL是設(shè)計(jì)來(lái)處理一系列數(shù)據(jù)的. SELECT,UPDATE,和DELETE statements適用于相應(yīng)表的所有記錄,且通過(guò)WHERE字句來(lái)進(jìn)行篩選.也有很多的特性被設(shè)計(jì)來(lái)一次處理一條記錄,或操作標(biāo)量數(shù)據(jù)(scalar data).比如CURSORs允許一次遍歷所有的記錄.字符串操作功能,比如LEFT, CHARINDEX, 以及PATINDEX用來(lái)處理標(biāo)量數(shù)據(jù).SQL也包含了控制流聲明,比如IF和WHILE.
在Microsoft SQL Server 2005之前,存儲(chǔ)過(guò)程和用戶(hù)自定義函數(shù)UDFs只能當(dāng)做一個(gè)T-SQL statements集來(lái)創(chuàng)建,而SQL Server 2005設(shè)計(jì)時(shí)包含Common Language Runtime (CLR)。因此,對(duì)一個(gè)SQL Server 2005數(shù)據(jù)庫(kù)里的存儲(chǔ)過(guò)程和用戶(hù)定義方法,我們可以用managed code來(lái)進(jìn)行創(chuàng)建。那就也說(shuō)你可以在一個(gè)C#類(lèi)里創(chuàng)建一個(gè)存儲(chǔ)過(guò)程或用戶(hù)定義函數(shù).這樣一來(lái)我們就可以在.NET Framework或你自己定義的類(lèi)里面使用這些存儲(chǔ)過(guò)程或方法.
在本文我們將考察如何創(chuàng)建存儲(chǔ)過(guò)程和用戶(hù)定義函數(shù),以及如何將它們整合進(jìn)數(shù)據(jù)庫(kù)Northwind.讓我們開(kāi)始吧。
注意:管理數(shù)據(jù)庫(kù)對(duì)象(Managed database objects)與SQL數(shù)據(jù)庫(kù)里包含的相對(duì)應(yīng)的數(shù)據(jù)庫(kù)對(duì)象比較起來(lái)有一些優(yōu)勢(shì),主要體現(xiàn)在:使用的語(yǔ)言更豐富、熟悉;可以使用現(xiàn)有的代碼和邏輯.但是在處理那些并不包含很多邏輯的一系列數(shù)據(jù)時(shí),其效率可能要低一些.關(guān)與managed code相較T-SQL而言的優(yōu)勢(shì),請(qǐng)參閱文章《Advantages of Using Managed Code to Create Database Objects》(http://msdn2.microsoft.com/en-us/library/k2e1fb36(VS.80).aspx)
第一步:將Northwind數(shù)據(jù)庫(kù)移出App_Data文件夾
本教程到目前為止使用的是放在App_Data文件夾里的Microsoft SQL Server 2005 Express版本的數(shù)據(jù)庫(kù).
然而在本教程,我們將Northwind數(shù)據(jù)庫(kù)移出App_Data文件夾,再使用一個(gè)被注冊(cè)為SQL Server 2005 Express版本數(shù)據(jù)庫(kù)的實(shí)例。雖然我們不移出的話(huà)也可以執(zhí)行本文的這些步驟,不過(guò)將其注冊(cè)為一個(gè)SQL Server 2005 Express版本數(shù)據(jù)庫(kù)的實(shí)例的話(huà),這些步驟就要簡(jiǎn)單的多了。
本文下載代碼里包含2個(gè)數(shù)據(jù)庫(kù)文件:NORTHWND.MDF 和 NORTHWND_log.LDF,將它們放在一個(gè)叫DataFiles的文件夾里,先關(guān)閉Visual Studio,再將NORTHWND.MDF 和 NORTHWND_log.LDF文件從根目錄的App_Data文件夾里移出到根目錄以外的其它文件夾里。完成后,我們需要將Northwind數(shù)據(jù)庫(kù)注冊(cè)為SQL Server 2005 Express版本數(shù)據(jù)庫(kù)的實(shí)例。為此我們要用到SQL Server Management Studio.如果你沒(méi)有安裝的話(huà),可以在此下載并安裝:(http://www.microsoft.com/downloads/details.aspx?displaylang=enFamilyID=C243A5AE-4BD1-4E3D-94B8-5A0F62BF7796)。
打開(kāi)SQL Server Management Studio,如圖1所示,Management Studio首先問(wèn)我們連接什么服務(wù)器,在server name里鍵入“l(fā)ocalhost/SQLExpress” ,在Authentication下拉列表里選“Windows Authentication” 。點(diǎn)Connect.
圖1:連接恰當(dāng)?shù)臄?shù)據(jù)庫(kù)實(shí)例
一旦連接后,Object Explorer窗口將會(huì)把SQL Server 2005 Express版本數(shù)據(jù)庫(kù)實(shí)例的信息顯示出來(lái),比如databases, security information, management options等.
我們需要將DataFiles文件夾里的Northwind數(shù)據(jù)庫(kù)作為SQL Server 2005 Express版本數(shù)據(jù)庫(kù)實(shí)例。在Databases文件夾里右鍵單擊,選“Attach”項(xiàng)。這將打開(kāi)Attach Databases對(duì)話(huà)框.點(diǎn) Add 按鈕,找到NORTHWND.MDF文件,再點(diǎn)OK。這樣,你的屏幕看起來(lái)和圖2差不多:
圖2:連接到合適的數(shù)據(jù)庫(kù)實(shí)例
注意:當(dāng)通過(guò)Management Studio連接到SQL Server 2005 Express版本的數(shù)據(jù)庫(kù)實(shí)例時(shí),Attach Databases對(duì)話(huà)框不允許你瀏覽用戶(hù)私人文件目錄(user profile directories),比如My Documents.因此,一定要將NORTHWND.MDF 和 NORTHWND_log.LDF文件放在一個(gè)非用戶(hù)私人文件目錄里.
點(diǎn)OK完成后,Attach Databases對(duì)話(huà)框?qū)?huì)關(guān)閉,Object Explorer將會(huì)將新添加的數(shù)據(jù)庫(kù)列出來(lái)。問(wèn)題來(lái)了,它的名字可能是這樣的:9FE54661B32FDD967F51D71D0D5145CC_LINE ARTICLES/DATATUTORIALS/VOLUME 3/CSHARP/73/ASPNET_DATA_TUTORIAL_75_CS/APP_DATA/NORTHWND.MDF,我們將其重命名為“Northwind”,方法是在該數(shù)據(jù)庫(kù)右鍵單擊,選“Rename”.
圖3:將數(shù)據(jù)庫(kù)重命名為“Northwind”
第二步:在Visual Studio里創(chuàng)建一個(gè)新的解決方案和SQL Server Project
要在SQL Server 2005里創(chuàng)建管理存儲(chǔ)過(guò)程或用戶(hù)定義函數(shù),我們要在一個(gè)類(lèi)里用C# 代碼寫(xiě)這些存儲(chǔ)過(guò)程和用戶(hù)定義函數(shù)。一旦寫(xiě)完后,我們需要將該類(lèi)編譯為一個(gè) .dll文件,將該編譯文件注冊(cè)到一個(gè)SQL Server 數(shù)據(jù)庫(kù),然后在數(shù)據(jù)庫(kù)里創(chuàng)建一個(gè)存儲(chǔ)過(guò)程或用戶(hù)定義函數(shù)以指向編譯文件里對(duì)應(yīng)的方法。這些步驟要手工完成。我們可以在文本編輯器里寫(xiě)代碼,在命令行里用C#編譯器 (csc.exe)對(duì)其進(jìn)行編譯;用CREATE ASSEMBLY 命令或從Management Studio里將其注冊(cè)到數(shù)據(jù)庫(kù).添加存儲(chǔ)過(guò)程或用戶(hù)定義函數(shù)的方法類(lèi)似.幸運(yùn)的是 Visual Studio的Professional 和 Team Systems 版本包含一個(gè)SQL Server Project類(lèi)型,它可以自動(dòng)的完成這些工作.在本文,我們將使用SQL Server Project類(lèi)型來(lái)創(chuàng)建一個(gè)管理存儲(chǔ)過(guò)程和用戶(hù)定義函數(shù)。
注意:如果你使用的是Visual Studio的Visual Web Developer 或 Standard版本,你就要手動(dòng)完成了。在Step 13,我們將詳細(xì)介紹手動(dòng)完成的細(xì)節(jié).我們鼓勵(lì)你從Steps 2 看到Steps 12 ,再看Step 13.因?yàn)镾teps 2 到Steps 12包含了很重要的SQL Server 配置說(shuō)明,不管你用的是什么版本.
打開(kāi)Visual Studio. 從 File 菜單,選New Project以打開(kāi)New Project對(duì)話(huà)框(見(jiàn)圖4).點(diǎn)到Database工程類(lèi)型,在右邊的Templates列表,選擇創(chuàng)建一個(gè)新的SQL Server Project.我將其命名為ManagedDatabaseConstructs并放在一個(gè)名為T(mén)utorial75的解決方案里.
圖4:創(chuàng)建一個(gè)新的SQL Server Project
在New Project對(duì)話(huà)框里點(diǎn)OK按鈕,創(chuàng)建該解決方案和SQL Server Project.
一個(gè)SQL Server Project依賴(lài)于一個(gè)具體的數(shù)據(jù)庫(kù).因此,接下來(lái)我們要指定該信息。如圖5所示,New Database Reference對(duì)話(huà)框里指向了Northwind數(shù)據(jù)庫(kù),也就是我們?cè)诘谝徊嚼镒?cè)的SQL Server 2005 Express版本數(shù)據(jù)庫(kù)實(shí)例.
圖5:將SQL Server Project與Northwind數(shù)據(jù)庫(kù)聯(lián)系起來(lái)
為了對(duì)我們將要在本工程創(chuàng)建的管理存儲(chǔ)過(guò)程和用戶(hù)自定義函數(shù)進(jìn)行調(diào)試,我們需要激活SQL/CLR調(diào)試支持.無(wú)論什么時(shí)候?qū)⒁粋€(gè)SQL Server Project與新的數(shù)據(jù)庫(kù)聯(lián)系起來(lái)時(shí)(就像我們?cè)趫D5做的那樣),Visual Studio會(huì)詢(xún)問(wèn)我們是否激活SQL/CLR調(diào)試(如圖6),選Yes.
圖6:激活SQL/CLR調(diào)試
此時(shí),這個(gè)新的SQL Server Project已經(jīng)添加到解決方案里了。其包含一個(gè)Test Scripts文件夾,文件夾里是一個(gè)Test.sql文件。它用來(lái)對(duì)本工程添加的管理數(shù)據(jù)庫(kù)對(duì)象進(jìn)行調(diào)試,我們將在第12步考察調(diào)試.
我們現(xiàn)在可以對(duì)該工程添加新的管理存儲(chǔ)過(guò)程和用戶(hù)自定義函數(shù).不過(guò)在此之前,我們要將現(xiàn)有的web應(yīng)用程序包含進(jìn)解決方案。在 File 菜單里選Add項(xiàng),再選Existing Web Site.瀏覽到相應(yīng)的文件夾,點(diǎn)OK.如圖7所示,這將更新解決方案以包含2個(gè)工程:即website和名為ManagedDatabaseConstructs的SQL Server Project.
圖7:該解決方案現(xiàn)在包含2個(gè)工程
Web.config文件里的NORTHWNDConnectionString值當(dāng)前引用的是App_Data文件夾里的NORTHWND.MDF。由于我們已經(jīng)將其從App_Data文件夾移出了,其注冊(cè)為SQL Server 2005 Express版本數(shù)據(jù)庫(kù)實(shí)例,因此我們需要相應(yīng)的更新NORTHWNDConnectionString值。打開(kāi)Web.config文件,改動(dòng)NORTHWNDConnectionString值,像這樣:“Data Source=localhost/SQLExpress;Initial Catalog=Northwind;Integrated Security=True”.
完成后,你的Web.config文件的connectionStrings>節(jié)點(diǎn)看起來(lái)和下面的差不多:
connectionStrings>
add name="NORTHWNDConnectionString" connectionString=
"Data Source=localhost/SQLExpress;Initial Catalog=Northwind;
Integrated Security=True;Pooling=false"
providerName="System.Data.SqlClient" />
/connectionStrings>
注意:就像在上一章探討的一樣,當(dāng)從一個(gè)客戶(hù)端程序——比如一個(gè)ASP.NET website,調(diào)試一個(gè)SQL Server對(duì)象時(shí),我們需要關(guān)閉連接池。上面的連接字符串里我們關(guān)閉了連接池(“Pooling=false”). 如果你不打算從ASP.NET website調(diào)試管理存儲(chǔ)過(guò)程和用戶(hù)自定義函數(shù)的話(huà),激活連接池.
第三步:創(chuàng)建一個(gè)Managed Stored Procedure
要向Northwind數(shù)據(jù)庫(kù)添加一個(gè)管理存儲(chǔ)過(guò)程的話(huà),我們首先要?jiǎng)?chuàng)建一個(gè)存儲(chǔ)過(guò)程作為該SQL Server Project里的一個(gè)方法。從解決資源管理器里,右鍵單擊 ManagedDatabaseConstructs工程,選“添加新項(xiàng)”,這將展示Add New Item 對(duì)話(huà)框,其列出了可以添加到該工程的各種管理數(shù)據(jù)庫(kù)對(duì)象的類(lèi)型,如圖8所示,包括stored procedures 、User-Defined Functions等.我們來(lái)創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,用來(lái)簡(jiǎn)單的將那些處于discontinued狀態(tài)的產(chǎn)品返回,將該存儲(chǔ)過(guò)程文件命名為GetDiscontinuedProducts.cs.
圖8:添加一個(gè)新的存儲(chǔ)過(guò)程,名為GetDiscontinuedProducts.cs
這將創(chuàng)建一個(gè)新的C# class類(lèi)文件,如下:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetDiscontinuedProducts()
{
// Put your code here
}
}
我們注意到該存儲(chǔ)過(guò)程作為一個(gè)static方法來(lái)執(zhí)行,且位于一個(gè)名為StoredProcedures的部分類(lèi)(partial class)文件之內(nèi). 此外,該 GetDiscontinuedProducts方法有一個(gè)SqlProcedure特性, 這就標(biāo)明了該方法是一個(gè)存儲(chǔ)過(guò)程.
下面的代碼創(chuàng)建了一個(gè)SqlCommand對(duì)象,設(shè)其CommandText為一個(gè)SELECT查詢(xún),以返回Products table表里所有Discontinued列為1的記錄.它然后執(zhí)行該命令并將結(jié)果返回給客戶(hù)端程序.添加這些代碼到GetDiscontinuedProducts方法.
// Create the command
SqlCommand myCommand = new SqlCommand();
myCommand.CommandText =
@"SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued
FROM Products
WHERE Discontinued = 1";
// Execute the command and send back the results
SqlContext.Pipe.ExecuteAndSend(myCommand);
所有的管理數(shù)據(jù)庫(kù)對(duì)象都可以使用SqlContext對(duì)象,該對(duì)象展示“調(diào)用者”(caller)的內(nèi)容;而SqlContext又可以通過(guò)其Pipe屬性來(lái)訪(fǎng)問(wèn)一個(gè)SqlPipe對(duì)象,該對(duì)象用來(lái)在SQL Server數(shù)據(jù)庫(kù)和調(diào)用程序之間傳遞信息;而ExecuteAndSend方法,就像其名字暗示的那樣,執(zhí)行傳入的SqlCommand對(duì)象,并將結(jié)果返回給客戶(hù)端程序.
注意:管理數(shù)據(jù)庫(kù)對(duì)象最適合做這種存儲(chǔ)過(guò)程和用戶(hù)定義函數(shù)——使用procedural logic邏輯而不是set-based logic邏輯.所謂Procedural logic邏輯包括處理一系列一行行(on a row-by-row basis)的數(shù)據(jù)或者處理標(biāo)量數(shù)據(jù)(scalar data).然而,我們剛剛創(chuàng)建的GetDiscontinuedProducts方法,并未使用Procedural logic邏輯。其實(shí)該方法最理想的是作為一個(gè)T-SQL存儲(chǔ)過(guò)程來(lái)執(zhí)行.之所以作為一個(gè)管理存儲(chǔ)過(guò)程來(lái)執(zhí)行,是為了示范創(chuàng)建和配置管理存儲(chǔ)過(guò)程所必要的步驟.
步驟4:配置Managed Stored Procedure
代碼完成后我們準(zhǔn)備將其配置給Northwind數(shù)據(jù)庫(kù).“Deploy”項(xiàng)執(zhí)行的具體步驟我們將在第13步講明白。進(jìn)入解決資源管理器,在ManagedDatabaseConstructs工程名上右鍵單擊,選“Deploy”項(xiàng),然而,可能會(huì)出現(xiàn)如下的錯(cuò)誤消息:“Incorrect syntax near 'EXTERNAL'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the stored procedure sp_dbcmptlevel.”
該出錯(cuò)信息發(fā)生試圖將編譯文件注冊(cè)到Northwind數(shù)據(jù)庫(kù)時(shí).為了將一個(gè)編譯文件注冊(cè)到一個(gè)SQL Server 2005數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)的compatibility level必須設(shè)置為90.默認(rèn)下,一個(gè)新的SQL Server 2005數(shù)據(jù)庫(kù)的compatibility level為90.而Microsoft SQL Server 2000使用的數(shù)據(jù)庫(kù)的默認(rèn)compatibility level為80.由于使用的Northwind數(shù)據(jù)庫(kù)最初是一個(gè)Microsoft SQL Server 2000數(shù)據(jù)庫(kù),其compatibility level被設(shè)置為80,因此需要設(shè)置為90以便于進(jìn)行注冊(cè).要更新數(shù)據(jù)庫(kù)的compatibility level,在Management Studio里打開(kāi)一個(gè)New Query窗口,輸入:exec sp_dbcmptlevel 'Northwind', 90點(diǎn)擊工具欄上的執(zhí)行圖標(biāo)以運(yùn)行上述查詢(xún).
圖9:更新Northwind數(shù)據(jù)庫(kù)的Compatibility Level
更新后重新部署該SQL Server Project,這次應(yīng)該不會(huì)出錯(cuò)了.返回SQL Server Management Studio,在Object Explorer里的Northwind 數(shù)據(jù)庫(kù)上右鍵單擊,選“刷新”.接下來(lái),找到Programmability文件夾,再展開(kāi)Assemblies文件夾。如圖10所示,Northwind數(shù)據(jù)庫(kù)現(xiàn)在包含了一個(gè)由ManagedDatabaseConstructs工程生成的編譯文件.
圖10:該ManagedDatabaseConstructs編譯文件現(xiàn)在注冊(cè)到Northwind數(shù)據(jù)庫(kù)
也來(lái)打開(kāi)Stored Procedures文件夾。你將會(huì)看到名為GetDiscontinuedProducts的存儲(chǔ)過(guò)程。該存儲(chǔ)過(guò)程是在部署的時(shí)候創(chuàng)建的,它指向ManagedDatabaseConstructs編譯文件里的GetDiscontinuedProducts方法.當(dāng)執(zhí)行GetDiscontinuedProducts存儲(chǔ)過(guò)程時(shí),它反過(guò)來(lái)執(zhí)行GetDiscontinuedProducts方法.由于它是一個(gè)管理存儲(chǔ)過(guò)程(managed stored procedure),不能通過(guò)Management Studio來(lái)對(duì)其進(jìn)行編輯(因此,在存儲(chǔ)過(guò)程名旁邊有一個(gè)鎖的圖標(biāo))
圖11:GetDiscontinuedProducts存儲(chǔ)過(guò)程展示在Stored Procedures文件夾
還有一個(gè)障礙要克服:該數(shù)據(jù)庫(kù)被配置為阻止執(zhí)行managed code.我們來(lái)做一個(gè)實(shí)驗(yàn)。打開(kāi)一個(gè)new query窗口,執(zhí)行GetDiscontinuedProducts存儲(chǔ)過(guò)程.你將會(huì)收到如下的錯(cuò)誤信息:“Execution of user code in the .NET Framework is disabled. Enable ‘clr enabled'configuration option.”
讓我們檢查Northwind數(shù)據(jù)庫(kù)的配置信息,在查詢(xún)窗口鍵入并運(yùn)行命令“exec sp_configure”。其顯示“clr enabled”目前設(shè)置為0.
圖12:“clr enabled”目前設(shè)置為0.
我們注意到每條配置(如圖12)都有4個(gè)值:“minimum”、“maximum”、“config”、“run” 值.要更新“clr enabled”配置的“config”值,執(zhí)行如下的命令:exec sp_configure 'clr enabled', 1
如果你再運(yùn)行“exec sp_configure”的話(huà),你將看到上述聲明將“clr enabled”配置的“config”值設(shè)為1,而“run”值仍然為0.因此,我們需要執(zhí)行RECONFIGURE命令,它將會(huì)把“ run”值設(shè)為目前的“config”值.在查詢(xún)窗口輸入“RECONFIGURE”,再點(diǎn)工具欄上的執(zhí)行圖標(biāo).如果你運(yùn)行“exec sp_configure”的話(huà),現(xiàn)在你可以看到“clr enabled”配置的“config” 和 “run”值都為1.
完成“clr enabled”配置后,我們準(zhǔn)備運(yùn)行GetDiscontinuedProducts存儲(chǔ)過(guò)程.在查詢(xún)窗口鍵入并運(yùn)行命令“exec GetDiscontinuedProducts”.調(diào)用該存儲(chǔ)過(guò)程將導(dǎo)致執(zhí)行GetDiscontinuedProducts方法里相應(yīng)的managed code.代碼發(fā)出一個(gè)SELECT查詢(xún)并返回所有處于discontinued狀況的產(chǎn)品,并將數(shù)據(jù)返回給調(diào)用程序——具體到本例,就是SQL Server Management Studio.Management Studio將接收到的數(shù)據(jù)展示在Results窗口.
圖13:GetDiscontinuedProducts存儲(chǔ)過(guò)程返回所有處于Discontinued狀態(tài)的產(chǎn)品
第五步:創(chuàng)建接收輸入?yún)?shù)的Managed Stored Procedures
我們?cè)诒窘坛虅?chuàng)建的很多查詢(xún)和存儲(chǔ)過(guò)程都使用參數(shù).比如,在第67章,我們創(chuàng)建了一個(gè)名為GetProductsByCategoryID的存儲(chǔ)過(guò)程,它接收一個(gè)名為@CategoryID的輸入?yún)?shù).該存儲(chǔ)過(guò)程返回那些其CategoryID值與@CategoryID吻合的產(chǎn)品.
要?jiǎng)?chuàng)建接收輸入?yún)?shù)的managed stored procedure,僅僅在定義方法時(shí)指定這些參數(shù)即可.我們來(lái)做個(gè)演示,在ManagedDatabaseConstructs工程里添加一個(gè)名為GetProductsWithPriceLessThan的另一個(gè)managed stored procedure.該managed stored procedure接收一個(gè)指定了價(jià)格的參數(shù),返回所有的其UnitPrice列低于參數(shù)值的產(chǎn)品.
我們來(lái)進(jìn)行添加.在ManagedDatabaseConstructs工程名上右鍵單擊,選“添加新存儲(chǔ)過(guò)程”.將文件命名為GetProductsWithPriceLessThan.cs.就像我們?cè)趫D3看到的那樣,這將創(chuàng)建一個(gè)新的C# class類(lèi)文件.
更新GetProductsWithPriceLessThan方法以使其接收一個(gè)名叫price的SqlMoney類(lèi)型的輸入?yún)?shù).代碼如下:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetProductsWithPriceLessThan(SqlMoney price)
{
// Create the command
SqlCommand myCommand = new SqlCommand();
myCommand.CommandText =
@"SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued
FROM Products
WHERE UnitPrice @MaxPrice";
myCommand.Parameters.AddWithValue("@MaxPrice", price);
// Execute the command and send back the results
SqlContext.Pipe.ExecuteAndSend(myCommand);
}
GetProductsWithPriceLessThan方法的生命代碼和我們?cè)诘谌絼?chuàng)建的GetDiscontinuedProducts方法的聲明代碼很相似.唯一的不同在于GetProductsWithPriceLessThan方法接收一個(gè)輸入?yún)?shù)(price), 且SqlCommand的查詢(xún)里也包含了一個(gè)參數(shù)(@MaxPrice).
完成代碼添加后,重新部署SQL Server Project.接下來(lái),返回到SQL Server Management Studio并刷新Stored Procedures文件夾.你將會(huì)看到一個(gè)新的查詢(xún)——GetProductsWithPriceLessThan.從查詢(xún)窗口,鍵入并執(zhí)行命令“exec GetProductsWithPriceLessThan 25”,它會(huì)將所有價(jià)格低于25的產(chǎn)品顯示出來(lái),如圖14所示.
圖14:價(jià)格低于25的產(chǎn)品都顯示出來(lái)
第六步:從數(shù)據(jù)訪(fǎng)問(wèn)層調(diào)用Managed Stored Procedure
此時(shí),我們已經(jīng)向ManagedDatabaseConstructs工程添加了GetDiscontinuedProducts 和 GetProductsWithPriceLessThan這2個(gè)managed stored procedures,并把它們注冊(cè)到Northwind SQL Server數(shù)據(jù)庫(kù).我們同樣從SQL Server Management調(diào)用它們(見(jiàn)圖13和14)。為了使我們的ASP.NET應(yīng)用程序能調(diào)用這些managed stored procedures,因此我們需要將它們添加到體系的數(shù)據(jù)訪(fǎng)問(wèn)層和業(yè)務(wù)邏輯層.在這一步,我們向類(lèi)型化數(shù)據(jù)集NorthwindWithSprocs的ProductsTableAdapter添加2個(gè)新的方法.在第七步,我們將添加相應(yīng)的方法到業(yè)務(wù)邏輯層.
在Visual Studio里打開(kāi)類(lèi)型化數(shù)據(jù)集NorthwindWithSprocs,向ProductsTableAdapter添加一個(gè)名為GetDiscontinuedProducts的方法.
注意:由于我們已經(jīng)將Northwind數(shù)據(jù)庫(kù)移出了App_Data文件夾,所以我們應(yīng)該在Web.config文件里對(duì)連接字符串進(jìn)行相應(yīng)的更新。在第二步我們探討了更新Web.config文件里的NORTHWNDConnectionString的值.如果你忘記了更新的話(huà),當(dāng)你試圖向TableAdapter添加新方法的時(shí)候,你將看到這樣的錯(cuò)誤信息:“Failed to add query. Unable to find connection ‘NORTHWNDConnectionString' for object ‘Web.config'”.要克服這個(gè)問(wèn)題, 需要更新Web.config文件的NORTHWNDConnectionString值.就像在第二步探討的那樣,再重新向TableAdapter添加新方法,這次就不會(huì)出錯(cuò)了.
添加新方法的時(shí)候,TableAdapter查詢(xún)配置向?qū)紫仍?xún)問(wèn)我們?nèi)绾卧L(fǎng)問(wèn)數(shù)據(jù)庫(kù)。由于我們已經(jīng)創(chuàng)建并注冊(cè)了GetDiscontinuedProducts存儲(chǔ)過(guò)程,因此選“Use existing stored procedure”項(xiàng),點(diǎn)Next.
圖15:選“Use existing stored procedure” 項(xiàng)
接下來(lái)要我們選要調(diào)用的存儲(chǔ)過(guò)程。在左邊下拉列表里選存儲(chǔ)過(guò)程GetDiscontinuedProducts.
圖16:選GetDiscontinuedProducts存儲(chǔ)過(guò)程
由于GetDiscontinuedProducts將返回一系列的記錄行,我們選第一項(xiàng)(“Tabular data”) ,再點(diǎn)Next.
圖17: 選“Tabular Data” 項(xiàng)
最后,向?qū)б覀優(yōu)榉椒?,選中這2項(xiàng)并分別命名為FillByDiscontinued 和 GetDiscontinuedProducts.點(diǎn)Finish完成向?qū)?
圖18:將方法命名為FillByDiscontinued 和 GetDiscontinuedProducts
采用同樣的方法,為名為GetProductsWithPriceLessThan的managed stored procedure在ProductsTableAdapter里添加FillByPriceLessThan和 GetProductsWithPriceLessThan這2個(gè)方法.
圖19顯示的是為GetDiscontinuedProducts 和 GetProductsWithPriceLessThan這2個(gè)managed stored procedures在ProductsTableAdapter里添加各種方法后的界面.
圖19: ProductsTableAdapter包含了新添加的方法
第七步:向業(yè)務(wù)邏輯層添加相應(yīng)的方法
現(xiàn)在我們已經(jīng)更新了數(shù)據(jù)訪(fǎng)問(wèn)層,我們還需要向業(yè)務(wù)邏輯層添加相應(yīng)的方法.向ProductsBLLWithSprocs class類(lèi)添加如下的2種方法:
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable GetDiscontinuedProducts()
{
return Adapter.GetDiscontinuedProducts();
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable
GetProductsWithPriceLessThan(decimal priceLessThan)
{
return Adapter.GetProductsWithPriceLessThan(priceLessThan);
}
這2種方法都簡(jiǎn)單的調(diào)用數(shù)據(jù)訪(fǎng)問(wèn)層對(duì)應(yīng)的方法,并返回ProductsDataTable實(shí)例.而2種方法上面附加的DataObjectMethodAttribute標(biāo)記的作用是將方法包含到 ObjectDataSource控件的配置數(shù)據(jù)源向?qū)У腟ELECT標(biāo)簽里的下拉列表項(xiàng)里. (上部分完)
祝編程快樂(lè)!
作者簡(jiǎn)介
本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的書(shū),是4GuysFromRolla.com的創(chuàng)始人,自1998年以來(lái)一直應(yīng)用 微軟Web技術(shù)。大家可以點(diǎn)擊查看全部教程《[翻譯]Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)教程》,希望對(duì)大家的學(xué)習(xí)ASP.NET有所幫助。
您可能感興趣的文章:- asp.net 結(jié)合mysql存儲(chǔ)過(guò)程進(jìn)行分頁(yè)代碼
- asp.net安全、實(shí)用、簡(jiǎn)單的大容量存儲(chǔ)過(guò)程分頁(yè)
- asp.net 存儲(chǔ)過(guò)程調(diào)用
- asp.net結(jié)合aspnetpager使用SQL2005的存儲(chǔ)過(guò)程分頁(yè)
- asp.net sql存儲(chǔ)過(guò)程
- 在ASP.NET中用存儲(chǔ)過(guò)程執(zhí)行SQL語(yǔ)句
- asp.net利用存儲(chǔ)過(guò)程和div+css實(shí)現(xiàn)分頁(yè)(類(lèi)似于博客園首頁(yè)分頁(yè))
- 在ASP.NET 2.0中操作數(shù)據(jù)之六十五:在TableAdapters中創(chuàng)建新的存儲(chǔ)過(guò)程
- 在ASP.NET 2.0中操作數(shù)據(jù)之六十六:在TableAdapters中使用現(xiàn)有的存儲(chǔ)過(guò)程
- 在ASP.NET 2.0中操作數(shù)據(jù)之七十二:調(diào)試存儲(chǔ)過(guò)程