热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在ASP.NET2.0中操作数据之七十二:调试存储过程

在开发过程中,使用VisualStudio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样VisualStudio也支持对SQLServer里面的存储过程进行调试,下面就让我们看看具体的调试方法。

导言:

  Visual Studio有很多的调试功能.我们只需要稍稍点点鼠标,敲敲键盘就可以使用断点(breakpoints)来打断某个程序的执行,并查看其状态.除了调试代码以外,Visual Studio也支持对SQL Server里面的存储过程进行调试.就像可以在ASP.NET页面的后台代码类或Business Logic Layer class类里设置断点一样,我们也可以在存储过程里设置断点.

  本文我们将考察如何在Visual Studio的Server Explorer里进入存储过程并设置断点.当ASP.NET程序调用该存储过程时就会碰到该断点.

  注意:不幸的是只能在Visual Studio的Professional和Team Systems版本里才能对存储过程设置断点.如果你使用的是Visual Web Developer或Visual Studio的标准版,你就只能看教程是如何一步步的做的,但不能在自己的机器上实践.

SQL Server调试主题

  Microsoft SQL Server 2005集合了公共语言运行库(Common Language Runtime (CLR)),它可以被所有.NET模块使用.因此SQL Server 2005支持对数据库对象的管理.

  我们可以创建数据库对象,比如存储过程、用户定义的函数((UDFs)等,就像在一个C#类里定义的方法一样.你可以在从.NET Framework或自己定义的类里使用这些存储过程和自定义函数.当然,SQL Server 2005也支持T-SQL数据库对象.SQL Server 2005支持对T-SQL数据库对象以及管理数据库对象(managed database objects)的调试.不过只能在Visual Studio 2005专业版或Team Systems版本里才行.本文我们将考察对T-SQL数据库的调试.后面的教程我们将考察对管理数据库对象的调试.文章《Overview of T-SQL and CLR Debugging in SQL Server 2005》(http://blogs.msdn.com/sqlclr/archive/2006/06/29/651644.aspx)归纳了在Visual Studio里调试SQL Server 2005对象的3种途径:

.直接数据库调试(DDD)—在服务器资源管理器里进入某个T-SQL数据库对象,比如存储过程或用户定义函数UDFs.我们将在第一步考察该模式.

.应用程序调试—我们可以在一个数据库对象里设置断点,然后再返回到一个ASP.NET应用程序.当执行这些数据库对象时,将遇到断点并转到调试器.注意,在应用程序调试模式,我们不能在应用程序代码里打入一个数据库对象,所以我们必须直接在这些存储过程或用户义函数里设置断点.我们将在第二步考察该模式.

.通过一个SQL Server Project来调试

  Visual Studio专业版及Team Systems版包含一个SQL Server Project类型,它通常用来创建管理数据库对象(managed database objects),我们将在后面的教程考察SQL Server Projects及如何调试其内容.Visual Studio可以对本地或外部SQL Server实例进行调试。如果你使用的SQL Server数据库不在本地,那么自然,它就是一个外部实例.本文我们将使用本地SQL Server实例,调试外部SQL Server实例的存储过程要比调试本地的多出一些步骤.

  如果你使用的是一个本地SQL Server实例,那么你可以从第一步看到结尾.如果你使用的是外部SQL Server实例,那么你首先要确保是以Windows user帐户登录电脑,且包含一个连接到外部SQL Server实例的登录界面.此外,应全部以系统管理员角色登录.你可以参阅本文结尾的“Debugging T-SQL Database Objects on Remote Instances”部分,查看如何配置Visual Studio 和 SQL Server以调试外部实例.

  最后,我们应该明白支持T-SQL数据库对象调试的特性没有支持.NET应用程序调试的特性丰富.比如,不支持断点条件过滤(breakpoint conditions and filters),只能用到寥寥几个调试窗口;你无法使用Edit 和 Continue等等。更多详情请参阅文章《Limitations on Debugger Commands and Features》(http://msdn2.microsoft.com/en-us/library/ms165035(VS.80).aspx)

第一步:直接进入储存过程

  使用Visual Studio我们可以很容易地直接进入一个数据库对象。我们来看如何使用Direct Database Debugging (DDD)特性进入Northwind数据库里的Products_SelectByCategoryID存储过程.就像其名字揭示的那样,该存储过程返回特定category的产品信息。我们在第68章创建了该存储过程,在服务器资源管理器里展开Northwind数据库节点,接下来进入存储过程文件夹,在Products_SelectByCategoryID存储过程上右键单击,选“Step Into Stored Procedure”,这将打开调试器.因为该存储过程接受一个@CategoryID输入参数,我们输入1,这将返回“饮料”类产品的信息。

//img.jbzj.com/file_images/article/201605/2016051911474566.png
图1:使用值为“1”的@CategoryID输入参数

  指定@CategoryID参数的值后,就可以执行存储过程了.不过调试器执行完第一条Statement后就中止了,而不会完全运行存储过程.。注意边框上的黄色箭头,它指出了Statement在存储过程的当前位置.你可以在Watch窗口查看或编辑参数值,或者改写存储过程用到的参数名称.

//img.jbzj.com/file_images/article/201605/2016051911474667.png
图2:调试器调试完第一条Statement后就中止了

  希望一次只调试一条statement语句的话,点击工具栏上的“Step Over”按钮或按F10键。由于Products_SelectByCategoryID存储过程只包含了一条SELECT statement,所以按F10键将跨过这条语句并完成存储过程的执行。执行完毕后,其结果将显示在 Output窗口里,调速器也就中止了.

注意:T-SQL调试发生在statement级别,但对SELECT statement无效

第二步:为Website设置应用程序调试

  直接在服务器资源管理器里调试存储过程时需要手动设置,但很多时候我们感兴趣的是,当在ASP.NET应用程序里调用存储过程时才对其进行调试。当一个设置了断点的存储过程被应用程序调用,在执行过程中将遇到这个断点。我们可以查看和改变存储过程的参数值,就像我们在第一步做的那样.

  不过在次此之前我们需要将ASP.NET web应用程序与SQL Server调试器联系起来.在解决方案资源管理器里,在website名称(ASPNET_Data_Tutorial_74_CS)上右键单击,选“Property Pages”项,再在左边选“Start Options”,选中Debuggers区域的SQL Server选择框,如图3:

//img.jbzj.com/file_images/article/201605/2016051911474668.png
图3:在应用程序的属性页选择SQL Server方框

  另外,我们还要更新数据库连接字符串以禁用“连接池”。当关闭一个数据库的连接时,一个对应的SqlConnection对象将存放在连接池里。当建立一个数据库连接时,就可以重新获取该SqlConnection对象而用不着再创建一个新的连接.连接池提高了执行性能,默认时,其处于激活状态.不过在调试时我们将关闭连接池,因为处理从连接池检索来的连接时,不能正确的建立相应的调试基础构造(debugging infrastructure).

  要禁用连接池的话,更新Web.config文件的NORTHWNDConnectionString,包含一个“Pooling=false”设置.


 

  注意:一旦你完成从ASP.NET应用程序对SQL Server的调试后,务必还原连接池,在连接字符串里将Pooling设置删除或设置为“Pooling=true”.

  完成设置后,我们还需要对存储过程添加一个断点,并开始调试

第三步:添加断点并调试

  打开Products_SelectByCategoryID存储过程,在SELECT  statement的开头部分设置断点。方法点击边框恰当的地方或将光标放在SELECT  statement开始的地方再按F9。如图9所示,断点在边框呈现为一个红色圆点.

//img.jbzj.com/file_images/article/201605/2016051911474669.png
图4:在Products_SelectByCategoryID存储过程设置断点

  为了在客户端程序对一个 SQL 数据库对象进行调试,我们有必要设置数据库支持“应用程序调试”(application debugging),在服务器资源管理器里点到NORTHWND.MDF节点,右键单击,选“Application Debugging”.

//img.jbzj.com/file_images/article/201605/2016051911474670.png
图5:确保选中Application Debugging 项

  当设置好断点且激活“Application Debugging ”项时,我们就可以从ASP.NET 应用程序调用存储过程来进行调试。要调试的话,在“调试”菜单里选“开始调试”,或点 F5或点工具栏里的绿色小图标。这将开启调试器.

  Products_SelectByCategoryID存储过程是在第68章创建的,其对应的页面(~/AdvancedDAL/ExistingSprocs.aspx)包含了一个GridView控件,以显示该存储过程返回的结果.在浏览器里登录该页面,当执行过程遇到设置的断点时页面将返回到Visual Studio,就像在第一步看到的那样,我们可以进入存储过程的statements,查看并修改参数值.

//img.jbzj.com/file_images/article/201605/2016051911474671.png
图6:ExistingSprocs.aspx页面最开始显示的是 饮料类的产品

//img.jbzj.com/file_images/article/201605/2016051911474672.png
图7:执行到存储过程设置的断点

  在如图7所示的 Watch 窗口,参数@CategoryID的值为1,这是由于ExistingSprocs.aspx页面最开始显示的是饮料类产品的信息,而饮料类的CategoryID 值为1.在下拉列表里选择一个不同的值。这将导致页面回传并重新执行Products_SelectByCategoryID存储过程。再次遇到断点时,@CategoryID 参数的值就是你在下拉列表框里选择的CategoryID值.

//img.jbzj.com/file_images/article/201605/2016051911474773.png
图8:在下拉列表里选择一个不同的类

//img.jbzj.com/file_images/article/201605/2016051911474774.png
图9:参数@CategoryID反映的是在Web页面选择的类

  注意:如果你登录ExistingSprocs.aspx 页面时,没有碰到在Products_SelectByCategoryID存储过程里设置的断点,一定要确保ASP.NET应用程序的“属性页”的 Debuggers区域的SQL Server项被选中;关闭连接池;激活数据库的Application Debugging项.如果仍然还有问题的话,重新启动Visual Studio并再试一次.

调试T-SQL 数据库对象的远程实例

  在本地电脑上通过Visual Studio调试是比较直观容易的,但如果SQL Server和Visual Studio没有装在同一台机器上的话,我们需要做一些设置以使各方面工作正常,为此我们要做2方面的工作:

.确保以系统管理员的角色(sysadmin role)通过ADO.NET连接到数据库

.确保开发环境上Visual Studio使用的Windows user帐户是一个有效的属于系统管理员的角色(sysadmin role)的SQL Server登录帐户.

  第一项相对比较简单.首先确定从ASP.NET应用程序连接到数据库的用户帐户,接下来通过SQL Server Management Studio,将该帐户添加到sysadmin角色.

  第二项,你用来调试程序的Windows user帐户必须是连接到远程数据库的一个有效帐户,问题就在于你在本地工作站登录的Windows帐户不一定就是登录SQL Server的有效帐户.与其将你具体的登录帐户添加给SQL Server,一个更好的选择是将一些Windows user帐户分配为SQL Server调试帐户(SQL Server debugging account).然后,要调试一个远程SQL Server实例的数据库对象的话,你可以使用这些Windows登录帐户的认证(credentials)来运行Visual Studio.

  用一个例子来进行阐述。假设有个Windows帐户,名为SQLDebug.该帐户应该添加到远程SQL Server实例,以系统管理员角色进行合法登录.然后要从Visual Studio来调试远程SQL Server实例的话,我们应该以SQLDebug帐户来运行Visual Studio.于是我们可以这样来操作:退出我们的工作站,以SQLDebug帐户再次登录,然后运行Visual Studio.不过还有一个更简单点的方法,不用退出工作站,通过使用runas.exe来以SQLDebug的名义运行Visual Studio.这个runas.exe允许一个应用程序假借另一个帐户的名义来执行.要以SQLDebug的名义来运行Visual Studio的话,你可以在命令行键入如下的statement:

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

  关于该过程的更详细介绍请参阅文章《How To: Set SQL Server Permissions for Debugging》(http://msdn2.microsoft.com/en-us/library/w1bhybwz(VS.80).aspx)

  注意:如果你的开发机为Windows XP Service Pack 2版本的话,你需要对Internet连接防火墙进行配置以允许远程调试。文章《The How To: Enable SQL Server 2005 Debugging》(http://msdn2.microsoft.com/en-us/library/s0fk6z6e(VS.80).aspx)对此进行了描述,该过程包括2步:(a)在Visual Studio所在的主机,你必须向Exceptions list添加Devenv.exe,并打开TCP 135端口;(b)在远程(SQL)机器,你必须打开TCP 135端口,且向Exceptions list添加Dsqlservr.exe.如果你的域策略(domain policy)需要通过IPSec来进行网络通信(network communication)的话,你必须打开UDP 4500 和 UDP 500端口。

结语:

  除了支持对.NET程序代码进行调试外,Visual Studio也提供了对SQL Server 2005进行调试的多种选择.在本文,我们考察了这些选择中的2种:直接数据库调试(Direct Database Debugging)以及应用程序调试.要直接对一个T-SQL数据库对象进行调试的话,在服务器资源管理器里找到该对象,再右键单击选“Step Into …”. 这将打开调试器,且运行到该对象的第一条statement就终止了.此时,你可以进入该对象的statements,查看并修改参数值.在第一步,我们用该方法对Products_SelectByCategoryID存储过程进行了设置.

  应用程序调试允许直接在数据库对象里设置断点.当一个客户端程序(比如一个ASP.NET web程序)调用一个包含断点的数据库对象时,程序终止且切换到调试器界面。应用程序调试很有用,因为它更清楚的显示了到底是什么程序行为调用了某个具体的数据库对象.然而,该方法比直接数据库调试要多一些配置和步骤.

  数据库对象也可以通过SQL Server Projects来进行调试,在下一章我们将考察使用SQL Server Projects,以及如何利用其来创建和调试管理数据库对象(managed database objects)

  祝编程快乐!

作者简介

  本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的书,是4GuysFromRolla.com的创始人,自1998年以来一直应用 微软Web技术。大家可以点击查看全部教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望对大家的学习ASP.NET有所帮助。


推荐阅读
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文是关于C#类型系统、值类型和引用类型的概念性笔记。介绍了C#1系统类型的三个特性,静态类型的含义,显式类型和隐式类型的区别。还讨论了类、结构、数组类型、枚举、委托类型和接口类型属于哪一种类型。同时纠正了关于结构、引用类型和对象传递的错误表述。最后提到了C#4中使用动态类型的关键字。 ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
author-avatar
lovely夏的宠儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有