欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在ASP.NET 2.0中操作數(shù)據(jù)之七十二:調(diào)試存儲(chǔ)過(guò)程

 更新時(shí)間:2016年05月19日 11:43:12   作者:heker2007  
在開(kāi)發(fā)過(guò)程中,使用Visual Studio的斷點(diǎn)調(diào)試功能可以很方便幫我們調(diào)試發(fā)現(xiàn)程序存在的錯(cuò)誤,同樣Visual Studio也支持對(duì)SQL Server里面的存儲(chǔ)過(guò)程進(jìn)行調(diào)試,下面就讓我們看看具體的調(diào)試方法。

導(dǎo)言:

  Visual Studio有很多的調(diào)試功能.我們只需要稍稍點(diǎn)點(diǎn)鼠標(biāo),敲敲鍵盤(pán)就可以使用斷點(diǎn)(breakpoints)來(lái)打斷某個(gè)程序的執(zhí)行,并查看其狀態(tài).除了調(diào)試代碼以外,Visual Studio也支持對(duì)SQL Server里面的存儲(chǔ)過(guò)程進(jìn)行調(diào)試.就像可以在ASP.NET頁(yè)面的后臺(tái)代碼類或Business Logic Layer class類里設(shè)置斷點(diǎn)一樣,我們也可以在存儲(chǔ)過(guò)程里設(shè)置斷點(diǎn).

  本文我們將考察如何在Visual Studio的Server Explorer里進(jìn)入存儲(chǔ)過(guò)程并設(shè)置斷點(diǎn).當(dāng)ASP.NET程序調(diào)用該存儲(chǔ)過(guò)程時(shí)就會(huì)碰到該斷點(diǎn).

  注意:不幸的是只能在Visual Studio的Professional和Team Systems版本里才能對(duì)存儲(chǔ)過(guò)程設(shè)置斷點(diǎn).如果你使用的是Visual Web Developer或Visual Studio的標(biāo)準(zhǔn)版,你就只能看教程是如何一步步的做的,但不能在自己的機(jī)器上實(shí)踐.

SQL Server調(diào)試主題

  Microsoft SQL Server 2005集合了公共語(yǔ)言運(yùn)行庫(kù)(Common Language Runtime (CLR)),它可以被所有.NET模塊使用.因此SQL Server 2005支持對(duì)數(shù)據(jù)庫(kù)對(duì)象的管理.

  我們可以創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象,比如存儲(chǔ)過(guò)程、用戶定義的函數(shù)((UDFs)等,就像在一個(gè)C#類里定義的方法一樣.你可以在從.NET Framework或自己定義的類里使用這些存儲(chǔ)過(guò)程和自定義函數(shù).當(dāng)然,SQL Server 2005也支持T-SQL數(shù)據(jù)庫(kù)對(duì)象.SQL Server 2005支持對(duì)T-SQL數(shù)據(jù)庫(kù)對(duì)象以及管理數(shù)據(jù)庫(kù)對(duì)象(managed database objects)的調(diào)試.不過(guò)只能在Visual Studio 2005專業(yè)版或Team Systems版本里才行.本文我們將考察對(duì)T-SQL數(shù)據(jù)庫(kù)的調(diào)試.后面的教程我們將考察對(duì)管理數(shù)據(jù)庫(kù)對(duì)象的調(diào)試.文章《Overview of T-SQL and CLR Debugging in SQL Server 2005》(http://blogs.msdn.com/sqlclr/archive/2006/06/29/651644.aspx)歸納了在Visual Studio里調(diào)試SQL Server 2005對(duì)象的3種途徑:

.直接數(shù)據(jù)庫(kù)調(diào)試(DDD)—在服務(wù)器資源管理器里進(jìn)入某個(gè)T-SQL數(shù)據(jù)庫(kù)對(duì)象,比如存儲(chǔ)過(guò)程或用戶定義函數(shù)UDFs.我們將在第一步考察該模式.

.應(yīng)用程序調(diào)試—我們可以在一個(gè)數(shù)據(jù)庫(kù)對(duì)象里設(shè)置斷點(diǎn),然后再返回到一個(gè)ASP.NET應(yīng)用程序.當(dāng)執(zhí)行這些數(shù)據(jù)庫(kù)對(duì)象時(shí),將遇到斷點(diǎn)并轉(zhuǎn)到調(diào)試器.注意,在應(yīng)用程序調(diào)試模式,我們不能在應(yīng)用程序代碼里打入一個(gè)數(shù)據(jù)庫(kù)對(duì)象,所以我們必須直接在這些存儲(chǔ)過(guò)程或用戶義函數(shù)里設(shè)置斷點(diǎn).我們將在第二步考察該模式.

.通過(guò)一個(gè)SQL Server Project來(lái)調(diào)試

  Visual Studio專業(yè)版及Team Systems版包含一個(gè)SQL Server Project類型,它通常用來(lái)創(chuàng)建管理數(shù)據(jù)庫(kù)對(duì)象(managed database objects),我們將在后面的教程考察SQL Server Projects及如何調(diào)試其內(nèi)容.Visual Studio可以對(duì)本地或外部SQL Server實(shí)例進(jìn)行調(diào)試。如果你使用的SQL Server數(shù)據(jù)庫(kù)不在本地,那么自然,它就是一個(gè)外部實(shí)例.本文我們將使用本地SQL Server實(shí)例,調(diào)試外部SQL Server實(shí)例的存儲(chǔ)過(guò)程要比調(diào)試本地的多出一些步驟.

  如果你使用的是一個(gè)本地SQL Server實(shí)例,那么你可以從第一步看到結(jié)尾.如果你使用的是外部SQL Server實(shí)例,那么你首先要確保是以Windows user帳戶登錄電腦,且包含一個(gè)連接到外部SQL Server實(shí)例的登錄界面.此外,應(yīng)全部以系統(tǒng)管理員角色登錄.你可以參閱本文結(jié)尾的“Debugging T-SQL Database Objects on Remote Instances”部分,查看如何配置Visual Studio 和 SQL Server以調(diào)試外部實(shí)例.

  最后,我們應(yīng)該明白支持T-SQL數(shù)據(jù)庫(kù)對(duì)象調(diào)試的特性沒(méi)有支持.NET應(yīng)用程序調(diào)試的特性豐富.比如,不支持?jǐn)帱c(diǎn)條件過(guò)濾(breakpoint conditions and filters),只能用到寥寥幾個(gè)調(diào)試窗口;你無(wú)法使用Edit 和 Continue等等。更多詳情請(qǐng)參閱文章《Limitations on Debugger Commands and Features》(http://msdn2.microsoft.com/en-us/library/ms165035(VS.80).aspx)

第一步:直接進(jìn)入儲(chǔ)存過(guò)程

  使用Visual Studio我們可以很容易地直接進(jìn)入一個(gè)數(shù)據(jù)庫(kù)對(duì)象。我們來(lái)看如何使用Direct Database Debugging (DDD)特性進(jìn)入Northwind數(shù)據(jù)庫(kù)里的Products_SelectByCategoryID存儲(chǔ)過(guò)程.就像其名字揭示的那樣,該存儲(chǔ)過(guò)程返回特定category的產(chǎn)品信息。我們?cè)诘?8章創(chuàng)建了該存儲(chǔ)過(guò)程,在服務(wù)器資源管理器里展開(kāi)Northwind數(shù)據(jù)庫(kù)節(jié)點(diǎn),接下來(lái)進(jìn)入存儲(chǔ)過(guò)程文件夾,在Products_SelectByCategoryID存儲(chǔ)過(guò)程上右鍵單擊,選“Step Into Stored Procedure”,這將打開(kāi)調(diào)試器.因?yàn)樵摯鎯?chǔ)過(guò)程接受一個(gè)@CategoryID輸入?yún)?shù),我們輸入1,這將返回“飲料”類產(chǎn)品的信息。

http://img.jbzj.com/file_images/article/201605/2016051911474566.png
圖1:使用值為“1”的@CategoryID輸入?yún)?shù)

  指定@CategoryID參數(shù)的值后,就可以執(zhí)行存儲(chǔ)過(guò)程了.不過(guò)調(diào)試器執(zhí)行完第一條Statement后就中止了,而不會(huì)完全運(yùn)行存儲(chǔ)過(guò)程.。注意邊框上的黃色箭頭,它指出了Statement在存儲(chǔ)過(guò)程的當(dāng)前位置.你可以在Watch窗口查看或編輯參數(shù)值,或者改寫(xiě)存儲(chǔ)過(guò)程用到的參數(shù)名稱.

http://img.jbzj.com/file_images/article/201605/2016051911474667.png
圖2:調(diào)試器調(diào)試完第一條Statement后就中止了

  希望一次只調(diào)試一條statement語(yǔ)句的話,點(diǎn)擊工具欄上的“Step Over”按鈕或按F10鍵。由于Products_SelectByCategoryID存儲(chǔ)過(guò)程只包含了一條SELECT statement,所以按F10鍵將跨過(guò)這條語(yǔ)句并完成存儲(chǔ)過(guò)程的執(zhí)行。執(zhí)行完畢后,其結(jié)果將顯示在 Output窗口里,調(diào)速器也就中止了.

注意:T-SQL調(diào)試發(fā)生在statement級(jí)別,但對(duì)SELECT statement無(wú)效

第二步:為Website設(shè)置應(yīng)用程序調(diào)試

  直接在服務(wù)器資源管理器里調(diào)試存儲(chǔ)過(guò)程時(shí)需要手動(dòng)設(shè)置,但很多時(shí)候我們感興趣的是,當(dāng)在ASP.NET應(yīng)用程序里調(diào)用存儲(chǔ)過(guò)程時(shí)才對(duì)其進(jìn)行調(diào)試。當(dāng)一個(gè)設(shè)置了斷點(diǎn)的存儲(chǔ)過(guò)程被應(yīng)用程序調(diào)用,在執(zhí)行過(guò)程中將遇到這個(gè)斷點(diǎn)。我們可以查看和改變存儲(chǔ)過(guò)程的參數(shù)值,就像我們?cè)诘谝徊阶龅哪菢?

  不過(guò)在次此之前我們需要將ASP.NET web應(yīng)用程序與SQL Server調(diào)試器聯(lián)系起來(lái).在解決方案資源管理器里,在website名稱(ASPNET_Data_Tutorial_74_CS)上右鍵單擊,選“Property Pages”項(xiàng),再在左邊選“Start Options”,選中Debuggers區(qū)域的SQL Server選擇框,如圖3:

http://img.jbzj.com/file_images/article/201605/2016051911474668.png
圖3:在應(yīng)用程序的屬性頁(yè)選擇SQL Server方框

  另外,我們還要更新數(shù)據(jù)庫(kù)連接字符串以禁用“連接池”。當(dāng)關(guān)閉一個(gè)數(shù)據(jù)庫(kù)的連接時(shí),一個(gè)對(duì)應(yīng)的SqlConnection對(duì)象將存放在連接池里。當(dāng)建立一個(gè)數(shù)據(jù)庫(kù)連接時(shí),就可以重新獲取該SqlConnection對(duì)象而用不著再創(chuàng)建一個(gè)新的連接.連接池提高了執(zhí)行性能,默認(rèn)時(shí),其處于激活狀態(tài).不過(guò)在調(diào)試時(shí)我們將關(guān)閉連接池,因?yàn)樘幚韽倪B接池檢索來(lái)的連接時(shí),不能正確的建立相應(yīng)的調(diào)試基礎(chǔ)構(gòu)造(debugging infrastructure).

  要禁用連接池的話,更新Web.config文件的NORTHWNDConnectionString,包含一個(gè)“Pooling=false”設(shè)置.

<connectionStrings>
 <add name="NORTHWNDConnectionString" connectionString=
 "Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/NORTHWND.MDF;
  Integrated Security=True;User Instance=True;Pooling=false"
 providerName="System.Data.SqlClient" />
</connectionStrings>

  注意:一旦你完成從ASP.NET應(yīng)用程序?qū)QL Server的調(diào)試后,務(wù)必還原連接池,在連接字符串里將Pooling設(shè)置刪除或設(shè)置為“Pooling=true”.

  完成設(shè)置后,我們還需要對(duì)存儲(chǔ)過(guò)程添加一個(gè)斷點(diǎn),并開(kāi)始調(diào)試

第三步:添加斷點(diǎn)并調(diào)試

  打開(kāi)Products_SelectByCategoryID存儲(chǔ)過(guò)程,在SELECT  statement的開(kāi)頭部分設(shè)置斷點(diǎn)。方法點(diǎn)擊邊框恰當(dāng)?shù)牡胤交驅(qū)⒐鈽?biāo)放在SELECT  statement開(kāi)始的地方再按F9。如圖9所示,斷點(diǎn)在邊框呈現(xiàn)為一個(gè)紅色圓點(diǎn).

http://img.jbzj.com/file_images/article/201605/2016051911474669.png
圖4:在Products_SelectByCategoryID存儲(chǔ)過(guò)程設(shè)置斷點(diǎn)

  為了在客戶端程序?qū)σ粋€(gè) SQL 數(shù)據(jù)庫(kù)對(duì)象進(jìn)行調(diào)試,我們有必要設(shè)置數(shù)據(jù)庫(kù)支持“應(yīng)用程序調(diào)試”(application debugging),在服務(wù)器資源管理器里點(diǎn)到NORTHWND.MDF節(jié)點(diǎn),右鍵單擊,選“Application Debugging”.

http://img.jbzj.com/file_images/article/201605/2016051911474670.png
圖5:確保選中Application Debugging 項(xiàng)

  當(dāng)設(shè)置好斷點(diǎn)且激活“Application Debugging ”項(xiàng)時(shí),我們就可以從ASP.NET 應(yīng)用程序調(diào)用存儲(chǔ)過(guò)程來(lái)進(jìn)行調(diào)試。要調(diào)試的話,在“調(diào)試”菜單里選“開(kāi)始調(diào)試”,或點(diǎn) F5或點(diǎn)工具欄里的綠色小圖標(biāo)。這將開(kāi)啟調(diào)試器.

  Products_SelectByCategoryID存儲(chǔ)過(guò)程是在第68章創(chuàng)建的,其對(duì)應(yīng)的頁(yè)面(~/AdvancedDAL/ExistingSprocs.aspx)包含了一個(gè)GridView控件,以顯示該存儲(chǔ)過(guò)程返回的結(jié)果.在瀏覽器里登錄該頁(yè)面,當(dāng)執(zhí)行過(guò)程遇到設(shè)置的斷點(diǎn)時(shí)頁(yè)面將返回到Visual Studio,就像在第一步看到的那樣,我們可以進(jìn)入存儲(chǔ)過(guò)程的statements,查看并修改參數(shù)值.

http://img.jbzj.com/file_images/article/201605/2016051911474671.png
圖6:ExistingSprocs.aspx頁(yè)面最開(kāi)始顯示的是 飲料類的產(chǎn)品

http://img.jbzj.com/file_images/article/201605/2016051911474672.png
圖7:執(zhí)行到存儲(chǔ)過(guò)程設(shè)置的斷點(diǎn)

  在如圖7所示的 Watch 窗口,參數(shù)@CategoryID的值為1,這是由于ExistingSprocs.aspx頁(yè)面最開(kāi)始顯示的是飲料類產(chǎn)品的信息,而飲料類的CategoryID 值為1.在下拉列表里選擇一個(gè)不同的值。這將導(dǎo)致頁(yè)面回傳并重新執(zhí)行Products_SelectByCategoryID存儲(chǔ)過(guò)程。再次遇到斷點(diǎn)時(shí),@CategoryID 參數(shù)的值就是你在下拉列表框里選擇的CategoryID值.

http://img.jbzj.com/file_images/article/201605/2016051911474773.png
圖8:在下拉列表里選擇一個(gè)不同的類

http://img.jbzj.com/file_images/article/201605/2016051911474774.png
圖9:參數(shù)@CategoryID反映的是在Web頁(yè)面選擇的類

  注意:如果你登錄ExistingSprocs.aspx 頁(yè)面時(shí),沒(méi)有碰到在Products_SelectByCategoryID存儲(chǔ)過(guò)程里設(shè)置的斷點(diǎn),一定要確保ASP.NET應(yīng)用程序的“屬性頁(yè)”的 Debuggers區(qū)域的SQL Server項(xiàng)被選中;關(guān)閉連接池;激活數(shù)據(jù)庫(kù)的Application Debugging項(xiàng).如果仍然還有問(wèn)題的話,重新啟動(dòng)Visual Studio并再試一次.

調(diào)試T-SQL 數(shù)據(jù)庫(kù)對(duì)象的遠(yuǎn)程實(shí)例

  在本地電腦上通過(guò)Visual Studio調(diào)試是比較直觀容易的,但如果SQL Server和Visual Studio沒(méi)有裝在同一臺(tái)機(jī)器上的話,我們需要做一些設(shè)置以使各方面工作正常,為此我們要做2方面的工作:

.確保以系統(tǒng)管理員的角色(sysadmin role)通過(guò)ADO.NET連接到數(shù)據(jù)庫(kù)

.確保開(kāi)發(fā)環(huán)境上Visual Studio使用的Windows user帳戶是一個(gè)有效的屬于系統(tǒng)管理員的角色(sysadmin role)的SQL Server登錄帳戶.

  第一項(xiàng)相對(duì)比較簡(jiǎn)單.首先確定從ASP.NET應(yīng)用程序連接到數(shù)據(jù)庫(kù)的用戶帳戶,接下來(lái)通過(guò)SQL Server Management Studio,將該帳戶添加到sysadmin角色.

  第二項(xiàng),你用來(lái)調(diào)試程序的Windows user帳戶必須是連接到遠(yuǎn)程數(shù)據(jù)庫(kù)的一個(gè)有效帳戶,問(wèn)題就在于你在本地工作站登錄的Windows帳戶不一定就是登錄SQL Server的有效帳戶.與其將你具體的登錄帳戶添加給SQL Server,一個(gè)更好的選擇是將一些Windows user帳戶分配為SQL Server調(diào)試帳戶(SQL Server debugging account).然后,要調(diào)試一個(gè)遠(yuǎn)程SQL Server實(shí)例的數(shù)據(jù)庫(kù)對(duì)象的話,你可以使用這些Windows登錄帳戶的認(rèn)證(credentials)來(lái)運(yùn)行Visual Studio.

  用一個(gè)例子來(lái)進(jìn)行闡述。假設(shè)有個(gè)Windows帳戶,名為SQLDebug.該帳戶應(yīng)該添加到遠(yuǎn)程SQL Server實(shí)例,以系統(tǒng)管理員角色進(jìn)行合法登錄.然后要從Visual Studio來(lái)調(diào)試遠(yuǎn)程SQL Server實(shí)例的話,我們應(yīng)該以SQLDebug帳戶來(lái)運(yùn)行Visual Studio.于是我們可以這樣來(lái)操作:退出我們的工作站,以SQLDebug帳戶再次登錄,然后運(yùn)行Visual Studio.不過(guò)還有一個(gè)更簡(jiǎn)單點(diǎn)的方法,不用退出工作站,通過(guò)使用runas.exe來(lái)以SQLDebug的名義運(yùn)行Visual Studio.這個(gè)runas.exe允許一個(gè)應(yīng)用程序假借另一個(gè)帳戶的名義來(lái)執(zhí)行.要以SQLDebug的名義來(lái)運(yùn)行Visual Studio的話,你可以在命令行鍵入如下的statement:

runas.exe /user:SQLDebug "%PROGRAMFILES%/Microsoft Visual Studio 8/Common7/IDE/devenv.exe"

  關(guān)于該過(guò)程的更詳細(xì)介紹請(qǐng)參閱文章《How To: Set SQL Server Permissions for Debugging》(http://msdn2.microsoft.com/en-us/library/w1bhybwz(VS.80).aspx)

  注意:如果你的開(kāi)發(fā)機(jī)為Windows XP Service Pack 2版本的話,你需要對(duì)Internet連接防火墻進(jìn)行配置以允許遠(yuǎn)程調(diào)試。文章《The How To: Enable SQL Server 2005 Debugging》(http://msdn2.microsoft.com/en-us/library/s0fk6z6e(VS.80).aspx)對(duì)此進(jìn)行了描述,該過(guò)程包括2步:(a)在Visual Studio所在的主機(jī),你必須向Exceptions list添加Devenv.exe,并打開(kāi)TCP 135端口;(b)在遠(yuǎn)程(SQL)機(jī)器,你必須打開(kāi)TCP 135端口,且向Exceptions list添加Dsqlservr.exe.如果你的域策略(domain policy)需要通過(guò)IPSec來(lái)進(jìn)行網(wǎng)絡(luò)通信(network communication)的話,你必須打開(kāi)UDP 4500 和 UDP 500端口。

結(jié)語(yǔ):

  除了支持對(duì).NET程序代碼進(jìn)行調(diào)試外,Visual Studio也提供了對(duì)SQL Server 2005進(jìn)行調(diào)試的多種選擇.在本文,我們考察了這些選擇中的2種:直接數(shù)據(jù)庫(kù)調(diào)試(Direct Database Debugging)以及應(yīng)用程序調(diào)試.要直接對(duì)一個(gè)T-SQL數(shù)據(jù)庫(kù)對(duì)象進(jìn)行調(diào)試的話,在服務(wù)器資源管理器里找到該對(duì)象,再右鍵單擊選“Step Into …”. 這將打開(kāi)調(diào)試器,且運(yùn)行到該對(duì)象的第一條statement就終止了.此時(shí),你可以進(jìn)入該對(duì)象的statements,查看并修改參數(shù)值.在第一步,我們用該方法對(duì)Products_SelectByCategoryID存儲(chǔ)過(guò)程進(jìn)行了設(shè)置.

  應(yīng)用程序調(diào)試允許直接在數(shù)據(jù)庫(kù)對(duì)象里設(shè)置斷點(diǎn).當(dāng)一個(gè)客戶端程序(比如一個(gè)ASP.NET web程序)調(diào)用一個(gè)包含斷點(diǎn)的數(shù)據(jù)庫(kù)對(duì)象時(shí),程序終止且切換到調(diào)試器界面。應(yīng)用程序調(diào)試很有用,因?yàn)樗宄娘@示了到底是什么程序行為調(diào)用了某個(gè)具體的數(shù)據(jù)庫(kù)對(duì)象.然而,該方法比直接數(shù)據(jù)庫(kù)調(diào)試要多一些配置和步驟.

  數(shù)據(jù)庫(kù)對(duì)象也可以通過(guò)SQL Server Projects來(lái)進(jìn)行調(diào)試,在下一章我們將考察使用SQL Server Projects,以及如何利用其來(lái)創(chuàng)建和調(diào)試管理數(shù)據(jù)庫(kù)對(duì)象(managed database objects)

  祝編程快樂(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有所幫助。

相關(guān)文章

最新評(píng)論