<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        在ASP.NET 2.0中操作數(shù)據(jù)之七十三:用Managed Code創(chuàng)建存儲過程和用戶自定義函數(shù)(上部分)

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:37:23
        文檔

        在ASP.NET 2.0中操作數(shù)據(jù)之七十三:用Managed Code創(chuàng)建存儲過程和用戶自定義函數(shù)(上部分)

        在ASP.NET 2.0中操作數(shù)據(jù)之七十三:用Managed Code創(chuàng)建存儲過程和用戶自定義函數(shù)(上部分):導(dǎo)言: 數(shù)據(jù)庫,比如Microsoft's SQL Server 2005使用Transact-Structured Query Language (T-SQL)來插入、修改、檢索數(shù)據(jù).絕大多數(shù)數(shù)據(jù)庫系統(tǒng)都包含constructs來對一系列的SQL statements進(jìn)行分組,這些statements可以作為單獨(dú)的單
        推薦度:
        導(dǎo)讀在ASP.NET 2.0中操作數(shù)據(jù)之七十三:用Managed Code創(chuàng)建存儲過程和用戶自定義函數(shù)(上部分):導(dǎo)言: 數(shù)據(jù)庫,比如Microsoft's SQL Server 2005使用Transact-Structured Query Language (T-SQL)來插入、修改、檢索數(shù)據(jù).絕大多數(shù)數(shù)據(jù)庫系統(tǒng)都包含constructs來對一系列的SQL statements進(jìn)行分組,這些statements可以作為單獨(dú)的單

        導(dǎo)言:

          數(shù)據(jù)庫,比如Microsoft's SQL Server 2005使用Transact-Structured Query Language (T-SQL)來插入、修改、檢索數(shù)據(jù).絕大多數(shù)數(shù)據(jù)庫系統(tǒng)都包含constructs來對一系列的SQL statements進(jìn)行分組,這些statements可以作為單獨(dú)的單元來執(zhí)行.存儲過程就是一個例子,另一個例子是用戶自定義函數(shù)(UDFs), 我們將在第9步進(jìn)行詳細(xì)的探討.

          SQL是設(shè)計(jì)來處理一系列數(shù)據(jù)的. SELECT,UPDATE,和DELETE statements適用于相應(yīng)表的所有記錄,且通過WHERE字句來進(jìn)行篩選.也有很多的特性被設(shè)計(jì)來一次處理一條記錄,或操作標(biāo)量數(shù)據(jù)(scalar data).比如CURSORs允許一次遍歷所有的記錄.字符串操作功能,比如LEFT, CHARINDEX, 以及PATINDEX用來處理標(biāo)量數(shù)據(jù).SQL也包含了控制流聲明,比如IF和WHILE.

          在Microsoft SQL Server 2005之前,存儲過程和用戶自定義函數(shù)UDFs只能當(dāng)做一個T-SQL statements集來創(chuàng)建,而SQL Server 2005設(shè)計(jì)時(shí)包含Common Language Runtime (CLR)。因此,對一個SQL Server 2005數(shù)據(jù)庫里的存儲過程和用戶定義方法,我們可以用managed code來進(jìn)行創(chuàng)建。那就也說你可以在一個C#類里創(chuàng)建一個存儲過程或用戶定義函數(shù).這樣一來我們就可以在.NET Framework或你自己定義的類里面使用這些存儲過程或方法.

        在本文我們將考察如何創(chuàng)建存儲過程和用戶定義函數(shù),以及如何將它們整合進(jìn)數(shù)據(jù)庫Northwind.讓我們開始吧。

          注意:管理數(shù)據(jù)庫對象(Managed database objects)與SQL數(shù)據(jù)庫里包含的相對應(yīng)的數(shù)據(jù)庫對象比較起來有一些優(yōu)勢,主要體現(xiàn)在:使用的語言更豐富、熟悉;可以使用現(xiàn)有的代碼和邏輯.但是在處理那些并不包含很多邏輯的一系列數(shù)據(jù)時(shí),其效率可能要低一些.關(guān)與managed code相較T-SQL而言的優(yōu)勢,請參閱文章《Advantages of Using Managed Code to Create Database Objects》(http://msdn2.microsoft.com/en-us/library/k2e1fb36(VS.80).aspx)

        第一步:將Northwind數(shù)據(jù)庫移出App_Data文件夾

          本教程到目前為止使用的是放在App_Data文件夾里的Microsoft SQL Server 2005 Express版本的數(shù)據(jù)庫.

          然而在本教程,我們將Northwind數(shù)據(jù)庫移出App_Data文件夾,再使用一個被注冊為SQL Server 2005 Express版本數(shù)據(jù)庫的實(shí)例。雖然我們不移出的話也可以執(zhí)行本文的這些步驟,不過將其注冊為一個SQL Server 2005 Express版本數(shù)據(jù)庫的實(shí)例的話,這些步驟就要簡單的多了。

          本文下載代碼里包含2個數(shù)據(jù)庫文件:NORTHWND.MDF 和 NORTHWND_log.LDF,將它們放在一個叫DataFiles的文件夾里,先關(guān)閉Visual Studio,再將NORTHWND.MDF 和 NORTHWND_log.LDF文件從根目錄的App_Data文件夾里移出到根目錄以外的其它文件夾里。完成后,我們需要將Northwind數(shù)據(jù)庫注冊為SQL Server 2005 Express版本數(shù)據(jù)庫的實(shí)例。為此我們要用到SQL Server Management Studio.如果你沒有安裝的話,可以在此下載并安裝:(http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=C243A5AE-4BD1-4E3D-94B8-5A0F62BF7796)。

          打開SQL Server Management Studio,如圖1所示,Management Studio首先問我們連接什么服務(wù)器,在server name里鍵入“l(fā)ocalhost/SQLExpress” ,在Authentication下拉列表里選“Windows Authentication” 。點(diǎn)Connect.

        http://files.jb51.net/file_images/article/201605/2016052009143614.png
        圖1:連接恰當(dāng)?shù)臄?shù)據(jù)庫實(shí)例

          一旦連接后,Object Explorer窗口將會把SQL Server 2005 Express版本數(shù)據(jù)庫實(shí)例的信息顯示出來,比如databases, security information, management options等.

          我們需要將DataFiles文件夾里的Northwind數(shù)據(jù)庫作為SQL Server 2005 Express版本數(shù)據(jù)庫實(shí)例。在Databases文件夾里右鍵單擊,選“Attach”項(xiàng)。這將打開Attach Databases對話框.點(diǎn) Add 按鈕,找到NORTHWND.MDF文件,再點(diǎn)OK。這樣,你的屏幕看起來和圖2差不多:

        http://files.jb51.net/file_images/article/201605/2016052009143615.png
        圖2:連接到合適的數(shù)據(jù)庫實(shí)例

          注意:當(dāng)通過Management Studio連接到SQL Server 2005 Express版本的數(shù)據(jù)庫實(shí)例時(shí),Attach Databases對話框不允許你瀏覽用戶私人文件目錄(user profile directories),比如My Documents.因此,一定要將NORTHWND.MDF 和 NORTHWND_log.LDF文件放在一個非用戶私人文件目錄里.

          點(diǎn)OK完成后,Attach Databases對話框?qū)P(guān)閉,Object Explorer將會將新添加的數(shù)據(jù)庫列出來。問題來了,它的名字可能是這樣的:9FE54661B32FDD967F51D71D0D5145CC_LINE ARTICLES/DATATUTORIALS/VOLUME 3/CSHARP/73/ASPNET_DATA_TUTORIAL_75_CS/APP_DATA/NORTHWND.MDF,我們將其重命名為“Northwind”,方法是在該數(shù)據(jù)庫右鍵單擊,選“Rename”.

        http://files.jb51.net/file_images/article/201605/2016052009143716.png
        圖3:將數(shù)據(jù)庫重命名為“Northwind”

        第二步:在Visual Studio里創(chuàng)建一個新的解決方案和SQL Server Project

          要在SQL Server 2005里創(chuàng)建管理存儲過程或用戶定義函數(shù),我們要在一個類里用C# 代碼寫這些存儲過程和用戶定義函數(shù)。一旦寫完后,我們需要將該類編譯為一個 .dll文件,將該編譯文件注冊到一個SQL Server 數(shù)據(jù)庫,然后在數(shù)據(jù)庫里創(chuàng)建一個存儲過程或用戶定義函數(shù)以指向編譯文件里對應(yīng)的方法。這些步驟要手工完成。我們可以在文本編輯器里寫代碼,在命令行里用C#編譯器 (csc.exe)對其進(jìn)行編譯;用CREATE ASSEMBLY 命令或從Management Studio里將其注冊到數(shù)據(jù)庫.添加存儲過程或用戶定義函數(shù)的方法類似.幸運(yùn)的是 Visual Studio的Professional 和 Team Systems 版本包含一個SQL Server Project類型,它可以自動的完成這些工作.在本文,我們將使用SQL Server Project類型來創(chuàng)建一個管理存儲過程和用戶定義函數(shù)。

          注意:如果你使用的是Visual Studio的Visual Web Developer 或 Standard版本,你就要手動完成了。在Step 13,我們將詳細(xì)介紹手動完成的細(xì)節(jié).我們鼓勵你從Steps 2 看到Steps 12 ,再看Step 13.因?yàn)镾teps 2 到Steps 12包含了很重要的SQL Server 配置說明,不管你用的是什么版本.

          打開Visual Studio. 從 File 菜單,選New Project以打開New Project對話框(見圖4).點(diǎn)到Database工程類型,在右邊的Templates列表,選擇創(chuàng)建一個新的SQL Server Project.我將其命名為ManagedDatabaseConstructs并放在一個名為Tutorial75的解決方案里.

        http://files.jb51.net/file_images/article/201605/2016052009143717.png
        圖4:創(chuàng)建一個新的SQL Server Project

          在New Project對話框里點(diǎn)OK按鈕,創(chuàng)建該解決方案和SQL Server Project.

          一個SQL Server Project依賴于一個具體的數(shù)據(jù)庫.因此,接下來我們要指定該信息。如圖5所示,New Database Reference對話框里指向了Northwind數(shù)據(jù)庫,也就是我們在第一步里注冊的SQL Server 2005 Express版本數(shù)據(jù)庫實(shí)例.

        http://files.jb51.net/file_images/article/201605/2016052009143718.png
        圖5:將SQL Server Project與Northwind數(shù)據(jù)庫聯(lián)系起來

          為了對我們將要在本工程創(chuàng)建的管理存儲過程和用戶自定義函數(shù)進(jìn)行調(diào)試,我們需要激活SQL/CLR調(diào)試支持.無論什么時(shí)候?qū)⒁粋€SQL Server Project與新的數(shù)據(jù)庫聯(lián)系起來時(shí)(就像我們在圖5做的那樣),Visual Studio會詢問我們是否激活SQL/CLR調(diào)試(如圖6),選Yes.

        http://files.jb51.net/file_images/article/201605/2016052009143719.png
        圖6:激活SQL/CLR調(diào)試

          此時(shí),這個新的SQL Server Project已經(jīng)添加到解決方案里了。其包含一個Test Scripts文件夾,文件夾里是一個Test.sql文件。它用來對本工程添加的管理數(shù)據(jù)庫對象進(jìn)行調(diào)試,我們將在第12步考察調(diào)試.

          我們現(xiàn)在可以對該工程添加新的管理存儲過程和用戶自定義函數(shù).不過在此之前,我們要將現(xiàn)有的web應(yīng)用程序包含進(jìn)解決方案。在 File 菜單里選Add項(xiàng),再選Existing Web Site.瀏覽到相應(yīng)的文件夾,點(diǎn)OK.如圖7所示,這將更新解決方案以包含2個工程:即website和名為ManagedDatabaseConstructs的SQL Server Project.

        http://files.jb51.net/file_images/article/201605/2016052009143720.png
        圖7:該解決方案現(xiàn)在包含2個工程

          Web.config文件里的NORTHWNDConnectionString值當(dāng)前引用的是App_Data文件夾里的NORTHWND.MDF。由于我們已經(jīng)將其從App_Data文件夾移出了,其注冊為SQL Server 2005 Express版本數(shù)據(jù)庫實(shí)例,因此我們需要相應(yīng)的更新NORTHWNDConnectionString值。打開Web.config文件,改動NORTHWNDConnectionString值,像這樣:“Data Source=localhost/SQLExpress;Initial Catalog=Northwind;Integrated Security=True”.

          完成后,你的Web.config文件的<connectionStrings>節(jié)點(diǎn)看起來和下面的差不多:

        <connectionStrings>
         <add name="NORTHWNDConnectionString" connectionString=
         "Data Source=localhost/SQLExpress;Initial Catalog=Northwind;
         Integrated Security=True;Pooling=false"
         providerName="System.Data.SqlClient" />
        </connectionStrings>

          注意:就像在上一章探討的一樣,當(dāng)從一個客戶端程序——比如一個ASP.NET website,調(diào)試一個SQL Server對象時(shí),我們需要關(guān)閉連接池。上面的連接字符串里我們關(guān)閉了連接池(“Pooling=false”). 如果你不打算從ASP.NET website調(diào)試管理存儲過程和用戶自定義函數(shù)的話,激活連接池.

        第三步:創(chuàng)建一個Managed Stored Procedure

          要向Northwind數(shù)據(jù)庫添加一個管理存儲過程的話,我們首先要創(chuàng)建一個存儲過程作為該SQL Server Project里的一個方法。從解決資源管理器里,右鍵單擊 ManagedDatabaseConstructs工程,選“添加新項(xiàng)”,這將展示Add New Item 對話框,其列出了可以添加到該工程的各種管理數(shù)據(jù)庫對象的類型,如圖8所示,包括stored procedures 、User-Defined Functions等.我們來創(chuàng)建一個存儲過程,用來簡單的將那些處于discontinued狀態(tài)的產(chǎn)品返回,將該存儲過程文件命名為GetDiscontinuedProducts.cs.

        http://files.jb51.net/file_images/article/201605/2016052009143721.png
        圖8:添加一個新的存儲過程,名為GetDiscontinuedProducts.cs

        這將創(chuàng)建一個新的C# class類文件,如下:

        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
         }
        }
        

          我們注意到該存儲過程作為一個static方法來執(zhí)行,且位于一個名為StoredProcedures的部分類(partial class)文件之內(nèi). 此外,該 GetDiscontinuedProducts方法有一個SqlProcedure特性, 這就標(biāo)明了該方法是一個存儲過程.

          下面的代碼創(chuàng)建了一個SqlCommand對象,設(shè)其CommandText為一個SELECT查詢,以返回Products table表里所有Discontinued列為1的記錄.它然后執(zhí)行該命令并將結(jié)果返回給客戶端程序.添加這些代碼到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ù)庫對象都可以使用SqlContext對象,該對象展示“調(diào)用者”(caller)的內(nèi)容;而SqlContext又可以通過其Pipe屬性來訪問一個SqlPipe對象,該對象用來在SQL Server數(shù)據(jù)庫和調(diào)用程序之間傳遞信息;而ExecuteAndSend方法,就像其名字暗示的那樣,執(zhí)行傳入的SqlCommand對象,并將結(jié)果返回給客戶端程序.

          注意:管理數(shù)據(jù)庫對象最適合做這種存儲過程和用戶定義函數(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í)該方法最理想的是作為一個T-SQL存儲過程來執(zhí)行.之所以作為一個管理存儲過程來執(zhí)行,是為了示范創(chuàng)建和配置管理存儲過程所必要的步驟.

        步驟4:配置Managed Stored Procedure

          代碼完成后我們準(zhǔn)備將其配置給Northwind數(shù)據(jù)庫.“Deploy”項(xiàng)執(zhí)行的具體步驟我們將在第13步講明白。進(jìn)入解決資源管理器,在ManagedDatabaseConstructs工程名上右鍵單擊,選“Deploy”項(xiàng),然而,可能會出現(xiàn)如下的錯誤消息:“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.”

          該出錯信息發(fā)生試圖將編譯文件注冊到Northwind數(shù)據(jù)庫時(shí).為了將一個編譯文件注冊到一個SQL Server 2005數(shù)據(jù)庫,該數(shù)據(jù)庫的compatibility level必須設(shè)置為90.默認(rèn)下,一個新的SQL Server 2005數(shù)據(jù)庫的compatibility level為90.而Microsoft SQL Server 2000使用的數(shù)據(jù)庫的默認(rèn)compatibility level為80.由于使用的Northwind數(shù)據(jù)庫最初是一個Microsoft SQL Server 2000數(shù)據(jù)庫,其compatibility level被設(shè)置為80,因此需要設(shè)置為90以便于進(jìn)行注冊.要更新數(shù)據(jù)庫的compatibility level,在Management Studio里打開一個New Query窗口,輸入:exec sp_dbcmptlevel 'Northwind', 90點(diǎn)擊工具欄上的執(zhí)行圖標(biāo)以運(yùn)行上述查詢.

        http://files.jb51.net/file_images/article/201605/2016052009143722.png
        圖9:更新Northwind數(shù)據(jù)庫的Compatibility Level

          更新后重新部署該SQL Server Project,這次應(yīng)該不會出錯了.返回SQL Server Management Studio,在Object Explorer里的Northwind 數(shù)據(jù)庫上右鍵單擊,選“刷新”.接下來,找到Programmability文件夾,再展開Assemblies文件夾。如圖10所示,Northwind數(shù)據(jù)庫現(xiàn)在包含了一個由ManagedDatabaseConstructs工程生成的編譯文件.

        http://files.jb51.net/file_images/article/201605/2016052009143723.png
        圖10:該ManagedDatabaseConstructs編譯文件現(xiàn)在注冊到Northwind數(shù)據(jù)庫

          也來打開Stored Procedures文件夾。你將會看到名為GetDiscontinuedProducts的存儲過程。該存儲過程是在部署的時(shí)候創(chuàng)建的,它指向ManagedDatabaseConstructs編譯文件里的GetDiscontinuedProducts方法.當(dāng)執(zhí)行GetDiscontinuedProducts存儲過程時(shí),它反過來執(zhí)行GetDiscontinuedProducts方法.由于它是一個管理存儲過程(managed stored procedure),不能通過Management Studio來對其進(jìn)行編輯(因此,在存儲過程名旁邊有一個鎖的圖標(biāo))

        http://files.jb51.net/file_images/article/201605/2016052009143824.png
        圖11:GetDiscontinuedProducts存儲過程展示在Stored Procedures文件夾

          還有一個障礙要克服:該數(shù)據(jù)庫被配置為阻止執(zhí)行managed code.我們來做一個實(shí)驗(yàn)。打開一個new query窗口,執(zhí)行GetDiscontinuedProducts存儲過程.你將會收到如下的錯誤信息:“Execution of user code in the .NET Framework is disabled. Enable ‘clr enabled'configuration option.”

          讓我們檢查Northwind數(shù)據(jù)庫的配置信息,在查詢窗口鍵入并運(yùn)行命令“exec sp_configure”。其顯示“clr enabled”目前設(shè)置為0.

        http://files.jb51.net/file_images/article/201605/2016052009144025.png
        圖12:“clr enabled”目前設(shè)置為0.

          我們注意到每條配置(如圖12)都有4個值:“minimum”、“maximum”、“config”、“run” 值.要更新“clr enabled”配置的“config”值,執(zhí)行如下的命令:exec sp_configure 'clr enabled', 1

          如果你再運(yùn)行“exec sp_configure”的話,你將看到上述聲明將“clr enabled”配置的“config”值設(shè)為1,而“run”值仍然為0.因此,我們需要執(zhí)行RECONFIGURE命令,它將會把“ run”值設(shè)為目前的“config”值.在查詢窗口輸入“RECONFIGURE”,再點(diǎn)工具欄上的執(zhí)行圖標(biāo).如果你運(yùn)行“exec sp_configure”的話,現(xiàn)在你可以看到“clr enabled”配置的“config” 和 “run”值都為1.

          完成“clr enabled”配置后,我們準(zhǔn)備運(yùn)行GetDiscontinuedProducts存儲過程.在查詢窗口鍵入并運(yùn)行命令“exec GetDiscontinuedProducts”.調(diào)用該存儲過程將導(dǎo)致執(zhí)行GetDiscontinuedProducts方法里相應(yīng)的managed code.代碼發(fā)出一個SELECT查詢并返回所有處于discontinued狀況的產(chǎn)品,并將數(shù)據(jù)返回給調(diào)用程序——具體到本例,就是SQL Server Management Studio.Management Studio將接收到的數(shù)據(jù)展示在Results窗口.

        http://files.jb51.net/file_images/article/201605/2016052009144026.png
        圖13:GetDiscontinuedProducts存儲過程返回所有處于Discontinued狀態(tài)的產(chǎn)品

        第五步:創(chuàng)建接收輸入?yún)?shù)的Managed Stored Procedures

          我們在本教程創(chuàng)建的很多查詢和存儲過程都使用參數(shù).比如,在第67章,我們創(chuàng)建了一個名為GetProductsByCategoryID的存儲過程,它接收一個名為@CategoryID的輸入?yún)?shù).該存儲過程返回那些其CategoryID值與@CategoryID吻合的產(chǎn)品.

          要創(chuàng)建接收輸入?yún)?shù)的managed stored procedure,僅僅在定義方法時(shí)指定這些參數(shù)即可.我們來做個演示,在ManagedDatabaseConstructs工程里添加一個名為GetProductsWithPriceLessThan的另一個managed stored procedure.該managed stored procedure接收一個指定了價(jià)格的參數(shù),返回所有的其UnitPrice列低于參數(shù)值的產(chǎn)品.

          我們來進(jìn)行添加.在ManagedDatabaseConstructs工程名上右鍵單擊,選“添加新存儲過程”.將文件命名為GetProductsWithPriceLessThan.cs.就像我們在圖3看到的那樣,這將創(chuàng)建一個新的C# class類文件.

          更新GetProductsWithPriceLessThan方法以使其接收一個名叫price的SqlMoney類型的輸入?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方法的生命代碼和我們在第三步創(chuàng)建的GetDiscontinuedProducts方法的聲明代碼很相似.唯一的不同在于GetProductsWithPriceLessThan方法接收一個輸入?yún)?shù)(price), 且SqlCommand的查詢里也包含了一個參數(shù)(@MaxPrice).

          完成代碼添加后,重新部署SQL Server Project.接下來,返回到SQL Server Management Studio并刷新Stored Procedures文件夾.你將會看到一個新的查詢——GetProductsWithPriceLessThan.從查詢窗口,鍵入并執(zhí)行命令“exec GetProductsWithPriceLessThan 25”,它會將所有價(jià)格低于25的產(chǎn)品顯示出來,如圖14所示.

        http://files.jb51.net/file_images/article/201605/2016052009144027.png
        圖14:價(jià)格低于25的產(chǎn)品都顯示出來

        第六步:從數(shù)據(jù)訪問層調(diào)用Managed Stored Procedure

          此時(shí),我們已經(jīng)向ManagedDatabaseConstructs工程添加了GetDiscontinuedProducts 和 GetProductsWithPriceLessThan這2個managed stored procedures,并把它們注冊到Northwind SQL Server數(shù)據(jù)庫.我們同樣從SQL Server Management調(diào)用它們(見圖13和14)。為了使我們的ASP.NET應(yīng)用程序能調(diào)用這些managed stored procedures,因此我們需要將它們添加到體系的數(shù)據(jù)訪問層和業(yè)務(wù)邏輯層.在這一步,我們向類型化數(shù)據(jù)集NorthwindWithSprocs的ProductsTableAdapter添加2個新的方法.在第七步,我們將添加相應(yīng)的方法到業(yè)務(wù)邏輯層.

          在Visual Studio里打開類型化數(shù)據(jù)集NorthwindWithSprocs,向ProductsTableAdapter添加一個名為GetDiscontinuedProducts的方法.

          注意:由于我們已經(jīng)將Northwind數(shù)據(jù)庫移出了App_Data文件夾,所以我們應(yīng)該在Web.config文件里對連接字符串進(jìn)行相應(yīng)的更新。在第二步我們探討了更新Web.config文件里的NORTHWNDConnectionString的值.如果你忘記了更新的話,當(dāng)你試圖向TableAdapter添加新方法的時(shí)候,你將看到這樣的錯誤信息:“Failed to add query. Unable to find connection ‘NORTHWNDConnectionString' for object ‘Web.config'”.要克服這個問題, 需要更新Web.config文件的NORTHWNDConnectionString值.就像在第二步探討的那樣,再重新向TableAdapter添加新方法,這次就不會出錯了.

          添加新方法的時(shí)候,TableAdapter查詢配置向?qū)紫仍儐栁覀內(nèi)绾卧L問數(shù)據(jù)庫。由于我們已經(jīng)創(chuàng)建并注冊了GetDiscontinuedProducts存儲過程,因此選“Use existing stored procedure”項(xiàng),點(diǎn)Next.

        http://files.jb51.net/file_images/article/201605/2016052009144028.png
        圖15:選“Use existing stored procedure” 項(xiàng)

        接下來要我們選要調(diào)用的存儲過程。在左邊下拉列表里選存儲過程GetDiscontinuedProducts.

        http://files.jb51.net/file_images/article/201605/2016052009144029.png
        圖16:選GetDiscontinuedProducts存儲過程

        由于GetDiscontinuedProducts將返回一系列的記錄行,我們選第一項(xiàng)(“Tabular data”) ,再點(diǎn)Next.

        http://files.jb51.net/file_images/article/201605/2016052009144030.png
        圖17: 選“Tabular Data” 項(xiàng)


        最后,向?qū)б覀優(yōu)榉椒x中這2項(xiàng)并分別命名為FillByDiscontinued 和 GetDiscontinuedProducts.點(diǎn)Finish完成向?qū)?

        http://files.jb51.net/file_images/article/201605/2016052009144031.png
        圖18:將方法命名為FillByDiscontinued 和 GetDiscontinuedProducts

        采用同樣的方法,為名為GetProductsWithPriceLessThan的managed stored procedure在ProductsTableAdapter里添加FillByPriceLessThan和 GetProductsWithPriceLessThan這2個方法.

        圖19顯示的是為GetDiscontinuedProducts 和 GetProductsWithPriceLessThan這2個managed stored procedures在ProductsTableAdapter里添加各種方法后的界面.

        http://files.jb51.net/file_images/article/201605/2016052009144132.png
        圖19: ProductsTableAdapter包含了新添加的方法

        第七步:向業(yè)務(wù)邏輯層添加相應(yīng)的方法

          現(xiàn)在我們已經(jīng)更新了數(shù)據(jù)訪問層,我們還需要向業(yè)務(wù)邏輯層添加相應(yīng)的方法.向ProductsBLLWithSprocs class類添加如下的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種方法都簡單的調(diào)用數(shù)據(jù)訪問層對應(yīng)的方法,并返回ProductsDataTable實(shí)例.而2種方法上面附加的DataObjectMethodAttribute標(biāo)記的作用是將方法包含到 ObjectDataSource控件的配置數(shù)據(jù)源向?qū)У腟ELECT標(biāo)簽里的下拉列表項(xiàng)里. (上部分完)

          祝編程快樂!

        作者簡介

          本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創(chuàng)始人,自1998年以來一直應(yīng)用 微軟Web技術(shù)。大家可以點(diǎn)擊查看全部教程《[翻譯]Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)教程》,希望對大家的學(xué)習(xí)ASP.NET有所幫助。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        在ASP.NET 2.0中操作數(shù)據(jù)之七十三:用Managed Code創(chuàng)建存儲過程和用戶自定義函數(shù)(上部分)

        在ASP.NET 2.0中操作數(shù)據(jù)之七十三:用Managed Code創(chuàng)建存儲過程和用戶自定義函數(shù)(上部分):導(dǎo)言: 數(shù)據(jù)庫,比如Microsoft's SQL Server 2005使用Transact-Structured Query Language (T-SQL)來插入、修改、檢索數(shù)據(jù).絕大多數(shù)數(shù)據(jù)庫系統(tǒng)都包含constructs來對一系列的SQL statements進(jìn)行分組,這些statements可以作為單獨(dú)的單
        推薦度:
        標(biāo)簽: code 定義函數(shù) ASP.NET
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 91成人免费在线视频| 韩国免费一级成人毛片| 亚洲成A∨人片天堂网无码| 亚洲色无码国产精品网站可下载| 国产精品怡红院永久免费| 亚洲国产人成在线观看| 波多野结衣中文字幕免费视频| 久久久亚洲裙底偷窥综合| 国产成人yy免费视频| 亚洲va乱码一区二区三区| 妞干网免费视频观看| 国产精品亚洲小说专区| 亚洲乱码中文字幕综合234| 久久高潮一级毛片免费| 久久久久亚洲AV片无码| 永久看日本大片免费35分钟| 亚洲国产成人精品久久| 美女被免费视频网站a国产| 黄色毛片免费观看| 国产亚洲精品精品国产亚洲综合| 拍拍拍无挡视频免费观看1000| 亚洲精品国产成人99久久| 一本岛高清v不卡免费一三区| 亚洲综合激情五月色一区| 亚洲&#228;v永久无码精品天堂久久 | 污污网站18禁在线永久免费观看| 久久综合亚洲色HEZYO社区| 最近中文字幕免费mv视频7| 特级无码毛片免费视频| 国产成人无码综合亚洲日韩 | 十八禁视频在线观看免费无码无遮挡骂过 | 国产精品亚洲精品日韩电影| 亚洲午夜久久久影院伊人| 久久99国产综合精品免费| 亚洲一线产品二线产品| 亚洲精品成人网久久久久久| 久久精品无码精品免费专区| 亚洲综合一区二区三区四区五区| 亚洲欧洲日产国码高潮αv| 777成影片免费观看| 国产精品亚洲天堂|