介绍 SQL Server 2000可以让我们在查询分析器中直接调试存储过程到了现在的SQL Server 2005,这个功能被转移到了SQL Servr Management Studio和Visual Studio IDE内。 使用这个技术,我们可以在Visual Studio中一步一步地调试存储过程。 而且你也可以在存储过程中设置断点,这样当你调试你的程序时,这些断点就会生效。
SQL Server 2005的所有版本都支持调试功能(包括Express版)。 但是,只有Team Systems和Professional版本的Visual Studio才能在IDE内调试存储过程。 简而言之,如果你使用的是Visual Web Developer或者Visual Studio Standard版本的话,就不能在调试应用程序的时候,一步一步地调试存储过程或者进入到存储过程内部。
本文中,我将示例如何通过Visual Studio IDE调试SQL Server 2005的存储过程。 我们既会看到如何在IDE中直接一步一步地调试存储过程,也会看到如何给存储过程设置断点,并在调试应用程序的时候进入到断点处。 继续往下看,你会知道得更多!
SQL Server调试的不同方法 现在的SQL Server 2005中,所有的数据库调试都发生在Visual Studio IDE的内部。 数据库中的像存储过程、触发器和用户自定义函数(UDFs)这样的对象都是可以被调试的(译者注:本文中提到的数据库对象指的是存储过程、触发器或用户自定义函数)。 Visual Studio提供了3种调试这些数据库对象的方法。
·数据库中直接调试 – 在Visual Studio的服务器资源管理器中,右键单击某个数据库对象,然后选择“单步执行××”。 例如,当你右键单击一个存储过程的时候,弹出菜单中就会包含一个“单步执行存储过程”的选项。
·应用程序调试 – 在数据库对象内设置断点,然后通过应用程序进行调试。 当相关的ASP.NET程序处于调试状态,并且调用了数据库对象的时候,那么Visual Studio就会暂停在你所设置的断点之处,从而允许我们一步一步地对T-SQL语句进行调试。
·在SQL Server项目中调试 – 在Visual Studio中可以创建一个SQL Server项目。 该项目中可以包含T-SQL和数据库对象,并且这些数据库对象都可以通过SQL Server项目本身来调试。
关于这3种不同的SQL Server调试的更多信息,请参看:Overview of T-SQL and CLR Debugging in SQL Server 2005。
还有一个需要注意的地方就是,本文接下来所介绍的SQL Server调试是基于本地数据库的。 当然,无论是本地数据库还是远程数据库都是可以调试的。 本地数据库指的是数据库部署在本机上;远程数据库指的是数据库部署在本机之外的机器上。 调试本地数据库不需要做额外的设置, 但是调试远程数据库却要复杂得多。
本文主要介绍的是如何在数据库中直接调试,以及如何在ASP.NET程序中调试一个本地数据库。 详细点说就是,我们将调试App_Data文件夹下的SQL Server 2005 Express版本的数据库,你可以在本文的结尾处下载该数据库及示例程序。 在今后的其它文章中我们再研究如何在SQL Server项目中调试数据库。 接下来,我给大家简要讲一讲关于调试远程数据库的相关要点。
调试远程数据库 调试远程数据库最关键的要点在于,要确保启动Visual Studio的Windows用户与连接远程数据库的用户是同一个用户。 此外,该用户必须隶属于sysadmin角色。
例如,你可以在Windows的域中创建一个名为“TestDebug”的用户。 然后使其可以登录到远程SQL Server数据库,并将该用户添加到sysadmin角色内。 另外,你还需要使用“TestDebug”用户来登录你的电脑,或者确保使用runas.exe命令启动的Visual Studio运行在“TestDebug”用户下。 这样,你就可以使用我们接下来演示的方法来调试了。
更多的详细信息可以参看这本书:Hitchhiker''s Guide to Visual Studio and SQL Server, Seventh Edition。
在数据库中直接调试 在数据库中直接调试是调试SQL Server 2005的存储过程的最简单的方法。 在Visual Stuido的IDE中你可以选择单步执行存储过程,然后就可以一条语句一条语句地单步执行了,同时你也可以检查和修改存储过程内的T-SQL变量和参数。 本文结尾处提供下载的压缩包中包括一个SQL Server 2005 Express版本的Northwind数据库。 我在其中添加了一个名为“DoThings”的存储过程,它有一个参数@CategoryID。 这是一个没什么实用价值的存储过程,但是它有很多的T-SQL语句和变量,另外还有一个参数,这将使我们能更好地练习存储过程的调试。
在服务器资源管理器中右键单击“DoThings”存储过程,然后选择单步执行存储过程的选项。 (注意:SQL Server调试只有Team Systems和Professional版本的Visual Studio才支持。)
调试器启动并且执行存储过程。 因为存储过程“DoThings”需要一个传入值给@CategoryID,所以会弹出一个对话框让我们提供该值。 输入1后单击OK。
首先会执行第一条语句。 你可以选择逐语句或逐过程进行调试(快捷键分别为F11和F10),也可以在监视窗口中添加参数和变量。 存储过程调试期间的截屏如下图所示。 左侧的黄色箭头指的是当前执行的语句。 监视窗口中显示的是@CategoryID和@AvgPrice的类型和值。
存储过程知行完后,结果会显示在输出窗口中。
你可以看到,在数据库中直接调试存储过程是非常简单的,而且很好理解。 简单到你只需要在服务器资源管理器中,右键单击存储过程,然后选择单步执行存储过程即可。
在ASP.NET程序中调试数据库对象 数据库中直接调试可以让我们非常简单地在Visual Studio IDE里直接调试存储过程。 但是,有的时候我们需要在ASP.NET程序调用相关的存储过程的时候再调试。 这样,当某个数据库对象被调用的时候,我们就可以对其进行调试。
这种调试方法整合到了应用程序的调试之中。 要使用它需要做如下几步:
·给你想要调试的数据库对象添加断点。 数据库对象只有在包含断点的情况下才会被调试。 例如,一般情况下,应用程序在调用存储过程的时候,你是不能进入存储过程内部的, 如果你想调试存储过程,那就必须要在存储过程内部设置断点。
·配置应用程序,使其可以调试SQL Server对象。 这个比较容易,你只要选中一个复选框即可。
·禁用连接池。 连接池可以提高性能,它允许程序使用一个连接池中的某个空闲的连接来连接数据库。 如果启用它,就不能正确地调试了。 因为默认情况下是启用连接池的,所以我们必须在设置连接字符串的时候禁用它。 (当你完成了在ASP.NET程序中调试SQL Server对象的工作之后,一定要记得重新启用连接池)
接下来让我们来看一看这几个步骤具体该如何做。
首先,在Visual Studio中打开“DoThings”存储过程,然后在“DECLARE @AvgPrice money”这句上设置断点。 这样第一步就完成了,接下来做第二步。
配置ASP.NET程序,以使其支持SQL Server的调试。右键单击项目,然后选择属性。 此时将会弹出一个如下图所示的对话框。 选择启动选项,然后在“调试器”部分中选中“SQL Server”复选框。 这样就完成前两步了,还差最后一步。
最后一步,我们需要修改连接字符串,使其禁用连接池。 这个任务相当简单,你只要在你的连接字符串后加一个属性“Pooling=false”即可。 假设你将连接字符串信息定义在了Web.config的<connectionString>节点里,那么修改后的连接字符串如下所示:
<connectionStrings>
<add name="NorthwindConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\NORTHWND.MDF;Integrated Security=True;User Instance=True; Pooling=false" providerName="System.Data.SqlClient"/>
</connectionStrings>
现在,我们已经完成了这3个步骤。 为了演示如何调试,我们来创建一个调用“DoThings”存储过程的ASP.NET页。 本文结尾处你下载的Demo中就包含有这个页面。 当你调试ASP.NET程序并且访问了这个页的时候,程序就会暂停在存储过程中设置了断点的地方。 然后,你就可以单步执行存储过程,并且可以在监视窗口中查看和修改参数和变量的值,就像在数据库中直接调试存储过程一样。
结论
在SQL Server之前的版本中有一套用于调试存储过程的独立工具。 到了现在的SQL Server 2005,存储过程、触发器和用户自定义函数(UDFs)都是通过Visual Studio Team System和Professional版本来调试的。 它给我们带来了3种调试SQL Server的方法: 数据库中直接调试、应用程序调试和在SQL Server项目中调试。 本文中,我们一起研究了前两种调试方法(使用本地数据库)。