调试是编写应用程序的一个主要部分。Visual Studio .NET为自带的调试器提供了大量的增强性能,包括统一的调试界面、Web service调试以及跨语言调试。这种调试器的一个最有用的新功能体现在对存储过程的调试性能上。本文我将介绍在VS.NET中对SQL Server 2000存储过程进行调试的几种可选方法,以及你可能会遇到的一些配置问题。
许多商家使用SQL Server作为数据库,并将存储过程作为将数据返回VB中的机制,因此对存储过程进行逐步调试的能力成为开发的关键。Visual Basic 6中提供了Transact-SQL (T-SQL)调试,它但需要许多步骤来完成对调试过程的配置。另外,这种调试器是一个单独的程序,而且也不象VB调试器那么功能完备。VB.NET提供了对存储过程的调试,虽然用于远程调试的设置还需要一些额外的工作,但这种调试器同你用在VB代码中使用的一样。除了VB.NET和SQL Server 2000以外,你还可以使用其他版本的VB和SQL Server来调试存储过程。然而在OS、VB和SQL Server中可能会存在很多种配置,而且它们每一种都有其自身的配置问题,因此这里我将着重对SQL Server 2000和VB.NET进行讲解。
所有必需的文件都要被放在合适的位置上以便对存储过程进行调试(在表1中可以看到一列包含调试方法及其位置的文件)。如果你的机器中装了SQL Server ,那么在这个机器中调试存储过程就应该不会出现什么配置问题。你必须保证服务器和客户端的配置都是正确的,以便对存储过程进行远程调试,而且你必须在服务器中安装调试组件以保证远程调试的正确运行。
你可以使用三种方法来设置调试组件:可以在服务器中安装VS.NET;可以运行VS.NET安装程序并选择Remote Components Setup,它只用于安装你需要进行调试的文件;或者你可以手动复制和记录那些必需的文件。如果你不选择在服务器中完全安装一个VS.NET,那么Remote Components Setup会以一个链接的形式出现在安装VS.NET的第一个显示画面中(请查阅资源以了解更多远程调试的设置问题)。
安装好远程调试组件之后,VS.NET会对MSSDI98.dll文件进行升级,但不会将它复制到SQL Server \binn 目录下,你需要手动进行复制。想要对T-SQL进行调试的用户还需要在服务器端的sp_sdidebug上设置EXECUTE权限。这是一个位于master 数据库中的一个扩展存储过程,在缺省状态下只有系统管理员有EXECUTE权限来访问这个存储过程。如果适当地设置这些权限,用户就能够在该服务器的任何数据库中对存储过程进行调试了。如果调试器在无误时中断或者在逐步调试时出现问题,则需要检查事务日志中的Application Errors。
用SQL Explorer进行调试
SQL Explorer是VS.NET的一部分,它用于连接和运用数据库。要直接从SQL Explorer中调试存储过程,首先你要和数据库建立数据连接。打开SQL Explorer并选中Data Connections来连接Northwind数据库。右击并选中Add Connection,在Data Link属性窗口中输入SQL Server的服务器名以及注册信息,并选中Northwind作为缺省数据库。
建立好数据库连接之后,你需要展开SQL Server并查找到Sales By Year存储过程。展开该存储过程后你会发现它使用了两个参数:@Beginning_Date和@Ending_Date。参数下方的四项是由该存储过程返回的列。
右击该存储过程并选中Step Into Stored Procedure选项,此时会出现一个Run Stored Procedure对话框,它会提示你输入两个日期,因为该过程是包含参数的 。这个画面的好处在于它会告诉你每个参数的数据类型,以及它是输入参数型还是输出型参数。输入1/1/96 和1/1/97两个值。
在存储过程第一行的左页边上会出现一个黄色的箭头,这就说明现在处于调试状态。从这一点来看,调试存储过程和调试VB代码是一样的。你可以使用标准的VB调试键来对代码进行逐步调试或者继续运行。和在VB代码中一样,你可以使用书签以及设置断点。
Locals窗口用于显示任何本地变量的值(在这里指@Beginning_Date和@Ending_Date)。你还可以在Command窗口中检查变量的值。通过选中Debug | Windows找到VS.NET中的调试窗口。如果一个存储过程执行无误的话Output窗口中会出现这个消息:“The program 'SQL Debugger: T-SQL' has exited with code 0 (0x0)。”通过在Output窗口顶端的combo box中选中Database Output,你可以看到存储过程中SELECT语句的执行结果。
一个触发器(trigger)是在执行INSERT、UPDATE或DELETE语句时触发的SQL代码,由于触发器属于T-SQL代码,因此你可以对它们进行调试,但你不能单独调试它们,而必须对那些引发触发器的存储过程进行调试,然后再逐步调试触发器。你可以在Call Stack窗口中找到触发器和存储过程。
你还可以通过对调用它的存储过程进行逐步调试来调试一个用户定义的函数(UDF)。只要存储过程调用了该函数,调试器便会逐步对它进行调试。你会在Call Stack窗口中找到这个存储过程以及UDF。旁边带有黄色箭头的存储过程表示当前代码处于调试状态。比如,你可以建立这样一个存储过程,使用一个EmployeeID并返回职员姓名和一个以逗号分割开的职员分布区域的字符串(见列表A)。用SELECT语句调用ufn_GetEmployeeRegionString来返回该区域。只要执行这个SELECT语句,调试器便会开始调试UDF代码。你可以在Call Stack窗口中找到该存储过程和函数。
从你的代码中调试SQL
想要调试从VB程序中调用的存储过程,你可以在SQL Explorer中打开该存储过程并在其中设置一个断点。只要程序运行到设置断点的地方,调试器便开始对它进行调试。这对一个使用了大量参数的存储过程来说非常有用,因为这样避免了手动输入每个参数。
通过使用调用usp_GetEmployee 存储过程的Debug范例程序来逐步进行调试。比如,你可以查看范例程序中Display Regions按钮的代码(见列表1以及下载范例程序)。当该命令的ExecuteReader方法被调用时,你便可以开始逐步调试被调用的存储过程了。
点击Solution Explorer中的项目,开始对代码进行调试。选中Project | Properties,展开Configuration Properties文件夹并点击Debugging。查看画面底部的“SQL Server debugging”checkbox。
进入SQL Explorer,查看Northwind数据库中的usp_GetEmployee,双击进入编辑模式。在SET NOCOUNT ON一行设置断点。在调用ExecuteReader方法之后你还需要在VB代码中的这一行设置一个断点。它会显示“Do While dr.Read。”在这里你需要设置断点,因为调试器不会返回到调用该存储过程的VB代码中进行逐步调试;它会继续执行。运行这个应用程序,输入EmployeeID并点击Display Regions按钮。调试器会在存储过程中的第一个断点处停下来。
虽然使用了相同的VS.NET调试器,但是它在调试存储过程时还是有一些限制。比如,你无法在SQL语句当中终止执行。而且,它不能编辑和继续执行。如果你使用了PRINT语句,那么输出结果将不会出现在任何调试器窗口中。另外,如果SQL Server已经对原先的值进行了缓存,那么在调试器中变量的改变则可能无法在T-SQL代码中反映出来。
如你所看到的,VS.NET不仅提供了T-SQL调试功能,而且还提供了一个用于所有代码的单一调试界面。遗憾的是,运行远程调试需要进行大量的配置和测试工作。然而不管怎样,对存储过程进行调试的益处是完全值得你这么做的。