执行会在断点处暂停,此时,我们可以查看并更改存储过程的参数值,逐步地调试其各条语句,就像我们在步骤1 中所做的那样。
在我们可以对应用程序调用的存储过程进行调试之前,首先要指示ASP.NET web 应用程序与SQL Server 调试器相集成。首先,在 Solution Explorer 中右键单击网站名称(ASPNET_Data_Tutorial_74_VB) 。从关联菜单中选择 Property Pages 选项,然后选择左侧的Start Options 条目,选中 Debuggers 区域的 SQL Server 复选框(参见图 3 )。
图3:在应用程序的 Property Pages 上选中 SQL Server 复选框
此外,我们还需要更新应用程序使用的数据库连接字符串以禁用连接池。当某个数据库连接关闭时,相应的SqlConnection 对象将被放入到一个包含可用连接的池中。当建立一个数据库连接时,则可从这个池中检索到一个可用的连接对象,而无需创建并建立一个新的连接。连接对象的这种缓冲池功能提高了性能,该功能缺省情况下是开启的。但在调试时,我们要关闭连接池,其原因是,如果使用从该池中得到的连接,则不能正确重建调试的基础架构。
为了禁用连接池,更改Web.config 文件中的 NORTHWNDConnectionString ,使其包含 Pooling=false 设置。
注意: 通过 ASP.NET 应用程序完成SQL Server 调试后,请务必恢复连接池功能,方法是,删除连接字符串中的Pooling 设置(或将其设置为 Pooling=true )。
现在已完成 ASP.NET 应用程序配置,允许 Visual Studio 在 web 应用程序调用 SQL Server 数据库对象时对数据库对象进行调试。剩下的就是向存储过程添加断点并开始调试了! 打开Products_SelectByCategoryID 存储过程,在 SELECT 语句的开头设置一个断点。方法是,单击边框处恰当位置或将光标移到SELECT 语句开始处并按下 F9 。如图 4 所示,断点显示为空白处的一个红色圆圈。
图4:在 Products_SelectByCategoryID 存储过程中设置断点
为了通过客户端应用程序调试 SQL 数据库对象,必须将该数据库配置为支持应用程序调试。第一次设置断点时,此设置应会自动打开。但为谨慎起见,最好对此核实。在Server Explorer 中右键单击 NORTHWND.MDF 节点。关联菜单中的 Application Debugging 菜单项应处于选中状态。
图5:确保 Application Debugging 选项已启用
设置了断点并启用了 Application Debugging 选项后,就可以调试从 ASP.NET 应用程序调用的存储过程了。启动调试器:打开Debug 菜单并选择 Start Debugging ,或者按下F5 ,或者单击工具栏中的绿色 play 图标。此时,调试器启动,网站打开。
Products_SelectByCategoryID 存储过程是在对强类型 DataSet的 TableAdapter使用现有存储过程教程中创建的。其相应的 web 页面 (~/AdvancedDAL/ExistingSprocs.aspx) 包含一个 GridView 控件,以显示该存储过程返回的结果。通过浏览器访问该页面。打开页面后,Products_SelectByCategoryID 存储过程中的断点将被触发,程序控制权返回给Visual Studio 。如步骤 1 一样,您可以逐步调试存储过程的各条语句、查看并更改参数值。
图6:ExistingSprocs.aspx 页面最初显示饮料类产品
图7:执行到存储过程的断点
在图7 的Watch 窗口中可以看到,@CategoryID 参数的值为 1 。这是由于 ExistingSprocs.aspx 页面最初显示饮料类产品,而该类产品的CategoryID 值为 1 。从下拉列表中选择另一个分类。这将导致一次回传,并重新执行Products_SelectByCategoryID 存储过程。断点再次被触发,但这次 @CategoryID 参数的值反映的是所选下拉列表项的 CategoryID 。
图8:从下拉列表中选择另一个分类
图9:@CategoryID 参数反映 Web 页面上选择的分类
注意: 如果访问 ExistingSprocs.aspx 页面时没有触发 Products_SelectByCategoryID 存储过程中的断点,请确保 ASP.NET 应用程序的Properties Page 中 Debuggers 区域的SQL Server 复选框是选中的,连接池已禁用,并且数据库的Application Debugging 选项是启用的。如果还有问题,请重启Visual Studio 后重试。 若SQL Server 数据库实例与 Visual Studio 在同一台机器上,则通过Visual Studio 调试数据库对象相当简单。但如果 SQL Server 与Visual Studio 位于不同的机器上,则需要进行仔细配置以使各方面工作正常。为此我们的两个重要任务是: 确保通过 ADO.NET 连接到数据库时使用的登录帐户具有 系统管理员 (sysadmin) 的身份。
确保在开发机器上 Visual Studio 使用的 Windows 用户帐户是一个有效的、具有 sysadmin 身份的 SQL Server 登录帐户。
第一步相对简单。首先,确定使用哪个用户帐户来从ASP.NET 应用程序连接到数据库,然后通过SQL Server Management Studio 将此登录帐户添加到 sysadmin 角色中。
第二个任务要求您在调试应用程序时所使用的Windows 用户帐户是远程数据库上的一个有效的登录帐户。但有时您登录到工作站的Windows 帐户并非SQL Server 上的一个有效登录帐户。比起将您的特定登录帐户添加到SQL Server 来,一个更好的办法是将某个Windows 用户帐户指定为 SQL Server 调试帐户。然后,可以使用该Windows 登录帐户的证书运行 Visual Studio ,以便调试远程SQL Server 实例的数据库对象。
下面用一个例子来说明上述情况。假设Windows 域中有一个名为 SQLDebug 的Windows 帐户。需要将此帐户添加到远程 SQL Server 实例中,使其作为一个有效登录帐户及sysadmin 角色的一个成员。然后,我们需要以 SQLDebug 用户身份运行 Visual Studio ,以便通过 Visual Studio 调试远程 SQL Server 实例。这可以通过如下步骤完成:从工作站退出,用SQLDebug 帐户重新登录,然后启动 Visual Studio 。但一个更简单的方法是用我们自己的证书登录工作站,然后使用runas.exe 作为 SQLDebug 用户启动Visual Studio 。利用runas.exe ,可以借其他用户帐户的身份执行特定的应用程序。要作为SQLDebug 用户来启动Visual Studio ,可以命令行输入以下命令: runas.exe /user:SQLDebug "%PROGRAMFILES%\Microsoft Visual Studio 8\Common7\IDE\devenv.exe" 关于该过程的更详细的介绍,请参见 William R. Vaughn 的 Hitchhiker's Guide to Visual Studio and SQL Server, Seventh Edition ,以及怎样为调试设置 SQL Server 权限 。
注意: 如果您的开发机器运行的是 Windows XP Service Pack 2 ,您将需要配置Internet Connection Firewall 以允许远程调试。文章怎样启用 SQL Server 2005 调试 中提到这一过程包含两个步骤:"(a) 在Visual Studio 宿主机器上,必须向 Exceptions 列表添加 Devenv.exe ,并打开 TCP 135 端口;(b) 在远程 (SQL ) 机器上,必须打开TCP 135 端口并向 Exceptions 列表添加 sqlservr.exe 。如果您的域策略要求通过IPSec 进行网络通信,则必须打开 UDP 4500 和 UDP 500 端口。 除了支持 .NET 应用程序代码的调试,Visual Studio 还为 SQL Server 2005 提供了多种可选的调试方法。本教程中我们学习了其中两种方法:直接数据库调试和应用程序调试。要直接调试一个T-SQL 数据库对象,先通过Server Explorer 找到该对象,右键单击该对象,然后选择"Step Into" 。此时,调试器会启动,并在该数据库对象的第一条语句处暂停。这时您可以逐步调试该对象的各条语句,查看并更改参数值。在步骤1 中我们使用了这种方法来进入 Products_SelectByCategoryID 存储过程进行调试。
应用程序调试允许直接在数据库对象中设置断点。当从客户端应用程序(如一个ASP.NET web 应用程序)调用含有断点的数据库对象时,程序会暂停,调试器会接管程序的控制权。应用程序调试方法非常有用,原因是,它可以更清楚地展示对特定数据库对象的调用是由哪个应用程序操作引起的。但是,比起直接数据库调试方法,它需要进行较多的配置和设置。
我们还可通过 SQL Server Project 来对数据库对象进行调试。我们将在下一篇教程中看到对SQL Server Project 的使用,该教程将会讲述怎样使用SQL Server Project 来创建并调试托管数据库对象。
快乐编程!