调试存储过程 (VB)

作者 :Scott Mitchell

下载 PDF

Visual Studio Professional和 Team System 版本允许设置断点并单步执行SQL Server中的存储过程,使调试存储过程就像调试应用程序代码一样简单。 本教程演示存储过程的直接数据库调试和应用程序调试。

简介

Visual Studio 提供丰富的调试体验。 只需几次击键或单击鼠标,就可以使用断点停止程序执行并检查其状态和控制流。 除了调试应用程序代码外,Visual Studio 还支持从SQL Server内部调试存储过程。 就像可以在 ASP.NET 代码隐藏类或业务逻辑层类的代码中设置断点一样,也可以将其放置在存储过程中。

在本教程中,我们将介绍从 Visual Studio 中的服务器资源管理器单步执行存储过程,以及如何设置从正在运行的 ASP.NET 应用程序中调用存储过程时命中的断点。

注意

遗憾的是,存储过程只能通过 Visual Studio 的 Professional 和 Team Systems 版本进行单步执行和调试。 如果你使用的是 Visual Web Developer 或 Visual Studio 的标准版本,欢迎在我们逐步完成调试存储过程所需的步骤时阅读,但你将无法在计算机上复制这些步骤。

SQL Server调试概念

Microsoft SQL Server 2005 旨在提供与公共语言运行时 (CLR) 的集成,这是所有 .NET 程序集使用的运行时。 因此,SQL Server 2005 支持托管数据库对象。 也就是说,可以在 Visual Basic 类中创建存储过程和 User-Defined Functions 等数据库对象, (UDF) 作为方法。 这使这些存储过程和 UDF 能够利用.NET Framework和你自己的自定义类中的功能。 当然,SQL Server 2005 还提供对 T-SQL 数据库对象的支持。

SQL Server 2005 提供对 T-SQL 和托管数据库对象的调试支持。 但是,这些对象只能通过 Visual Studio 2005 Professional 和 Team Systems 版本进行调试。 在本教程中,我们将检查 T-SQL 数据库对象的调试。 后续教程介绍如何调试托管数据库对象。

SQL Server 2005 CLR 集成团队的 SQL Server 2005 中的 T-SQL 和 CLR 调试概述博客文章重点介绍了从 Visual Studio 调试 SQL Server 2005 对象的三种方法:

  • 直接数据库调试 (DDD) - 在服务器资源管理器中,我们可以单步执行任何 T-SQL 数据库对象,例如存储过程和 UDF。 我们将在步骤 1 中检查 DDD。
  • 应用程序调试 - 我们可以在数据库对象中设置断点,然后运行 ASP.NET 应用程序。 执行数据库对象时,将命中断点并将控制权移交给调试器。 请注意,通过应用程序调试,我们无法从应用程序代码单步执行数据库对象。 我们必须在希望调试器停止的存储过程或 UDF 中显式设置断点。 从步骤 2 开始检查应用程序调试。
  • 从 SQL Server Project 进行调试 - Visual Studio Professional和 Team Systems 版本包括通常用于创建托管数据库对象的 SQL Server Project 类型。 我们将在下一教程中检查如何使用SQL Server项目并调试其内容。

Visual Studio 可以调试本地和远程SQL Server实例上的存储过程。 本地SQL Server实例是与 Visual Studio 安装在同一台计算机上的实例。 如果使用的 SQL Server 数据库不在开发计算机上,则被视为远程实例。 在这些教程中,我们一直在使用本地SQL Server实例。 与在本地实例上调试存储过程相比,在远程 SQL Server 实例上调试存储过程需要更多配置步骤。

如果使用本地SQL Server实例,则可以从步骤 1 开始,最后完成本教程。 但是,如果使用远程SQL Server实例,则首先需要确保在调试时,使用远程实例上具有SQL Server登录名的 Windows 用户帐户登录到开发计算机。 此外,此数据库登录名和用于从正在运行的 ASP.NET 应用程序连接到数据库的数据库登录名必须是角色 sysadmin 的成员。 有关配置 Visual Studio 和SQL Server以调试远程实例的详细信息,请参阅本教程末尾的调试远程实例上的 T-SQL 数据库 对象部分。

最后,了解对 T-SQL 数据库对象的调试支持不像对 .NET 应用程序的调试支持那样丰富。 例如,不支持断点条件和筛选器,只有一部分调试窗口可用,不能使用“编辑并继续”,即时窗口呈现无用,等等。 有关详细信息 ,请参阅对调试器命令和功能的限制

步骤 1:直接单步执行存储过程

使用 Visual Studio 可以轻松直接调试数据库对象。 让我们看看如何使用 Direct Database Debugging (DDD) 功能单步执行 Products_SelectByCategoryID Northwind 数据库中的存储过程。 顾名思义, Products_SelectByCategoryID 返回特定类别的产品信息;它是在 对类型化数据集使用现有存储过程的 TableAdapters 教程中创建的。 首先转到服务器资源管理器并展开 Northwind 数据库节点。 接下来,向下钻取到“存储过程”文件夹,右键单击 Products_SelectByCategoryID 存储过程,然后从上下文菜单中选择“单步执行存储过程”选项。 这将启动调试器。

Products_SelectByCategoryID由于存储过程需要@CategoryID输入参数,因此需要提供此值。 输入 1,这将返回有关饮料的信息。

将值 1 用于 <span class=@CategoryID Parameter“ />

图 1:对参数使用值 1 @CategoryID

提供 参数的值 @CategoryID 后,将执行存储过程。 不过,调试器不运行到完成状态,而是在第一个语句上停止执行。 请注意边距中的黄色箭头,指示存储过程中的当前位置。 可以通过“监视”窗口或将鼠标悬停在存储过程中的参数名称上来查看和编辑参数值。

调试器已在存储过程的第一条语句上停止

图 2:在存储过程的第一条语句上,调试器已停止 (单击以查看全尺寸图像)

若要一次单步执行一条语句,请单击工具栏中的“单步执行”按钮或按 F10 键。 存储过程 Products_SelectByCategoryID 包含单个 SELECT 语句,因此按 F10 将单步执行单个语句并完成存储过程的执行。 存储过程完成后,其输出将显示在“输出”窗口中,调试器将终止。

注意

T-SQL 调试发生在语句级别;不能单步执行 SELECT 语句。

步骤 2:为应用程序调试配置网站

虽然直接从服务器资源管理器调试存储过程很方便,但在许多情况下,当从 ASP.NET 应用程序调用存储过程时,我们更希望调试存储过程。 我们可以从 Visual Studio 中向存储过程添加断点,然后开始调试 ASP.NET 应用程序。 从应用程序调用具有断点的存储过程时,执行将在断点处停止,我们可以查看和更改存储过程的参数值并逐步执行其语句,就像在步骤 1 中所做的那样。

在开始调试从应用程序调用的存储过程之前,我们需要指示 ASP.NET Web 应用程序与 SQL Server 调试器集成。 首先右键单击解决方案资源管理器 (ASPNET_Data_Tutorial_74_VB) 中的网站名称。 从上下文菜单中选择“属性页”选项,选择左侧的“开始选项”项,然后检查“调试器”部分中的“SQL Server”复选框, (请参阅图 3) 。

选中应用程序属性页中的“SQL Server”复选框

图 3:选中“应用程序属性页”中的“SQL Server”复选框 (单击以查看全尺寸图像)

此外,我们需要更新应用程序使用的数据库连接字符串,以便禁用连接池。 关闭与数据库的连接时,相应的 SqlConnection 对象将置于可用连接的池中。 与数据库建立连接时,可以从此池检索可用的连接对象,而不必创建和建立新连接。 此连接对象池是一种性能增强功能,默认启用。 但是,在调试时,我们希望关闭连接池,因为在处理从池中获取的连接时,调试基础结构未正确重新建立。

若要禁用连接池,请更新 NORTHWNDConnectionString 中的 Web.config ,使其包含设置 Pooling=false

<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 应用程序完成调试SQL Server后,请务必通过从连接字符串 (中删除Pooling设置或将其设置为 Pooling=true ) 来恢复连接池。

此时,ASP.NET 应用程序已配置为允许 Visual Studio 在通过 Web 应用程序调用时调试SQL Server数据库对象。 现在剩下的就是向存储过程添加断点并开始调试!

步骤 3:添加断点和调试

Products_SelectByCategoryID打开存储过程并在语句的SELECT开头设置断点,方法是单击相应位置的边距,或者将光标置于语句开头SELECT并按 F9。 如图 4 所示,断点在边距中显示为一个红色圆圈。

在Products_SelectByCategoryID存储过程中设置断点

图 4:在存储过程中 Products_SelectByCategoryID 设置断点 (单击以查看全尺寸图像)

若要通过客户端应用程序调试 SQL 数据库对象,必须将数据库配置为支持应用程序调试。 首次设置断点时,此设置应自动打开,但谨慎的做法是双检查。 右键单击 NORTHWND.MDF 服务器资源管理器中的节点。 上下文菜单应包含名为“应用程序调试”的选中菜单项。

确保“应用程序调试”选项已启用

图 5:确保已启用应用程序调试选项

设置断点并启用应用程序调试选项后,我们可以在从 ASP.NET 应用程序调用时调试存储过程。 通过转到“调试”菜单并选择“开始调试”、点击 F5 或单击工具栏中的绿色播放图标来启动调试器。 这将启动调试器并启动网站。

存储过程 Products_SelectByCategoryID 是在 对 Typed DataSet s TableAdapters 使用现有存储过程 教程中创建的。 其相应的网页 (~/AdvancedDAL/ExistingSprocs.aspx) 包含显示此存储过程返回的结果的 GridView。 通过浏览器访问此页面。 到达页面后,将命中存储过程中的 Products_SelectByCategoryID 断点,并将控件返回到 Visual Studio。 与步骤 1 中一样,可以单步执行存储过程的 语句,并查看和修改参数值。

ExistingSprocs.aspx页面最初显示饮料

图 6:页面 ExistingSprocs.aspx 最初显示饮料 (单击以查看全尺寸图像)

已到达存储过程的断点

图 7:已到达存储过程断点 (单击以查看全尺寸图像)

如图 7 中的“监视”窗口所示,参数的 @CategoryID 值为 1。 这是因为页面 ExistingSprocs.aspx 最初显示“饮料”类别中的产品,其 CategoryID 值为 1。 从下拉列表中选择其他类别。 这样做会导致回发并重新执行 Products_SelectByCategoryID 存储过程。 再次命中断点,但这次 @CategoryID 参数值反映所选下拉列表项 s CategoryID

从 Drop-Down 列表中选择不同的类别

图 8:从 Drop-Down 列表中选择不同的类别 (单击以查看全尺寸图像)

<span class=@CategoryID 参数反映从网页中选择的类别“ />

图 9:参数 @CategoryID 反映从网页中选择的类别 (单击以查看全尺寸图像)

注意

如果在访问ExistingSprocs.aspx页面时未命中存储过程中的Products_SelectByCategoryID断点,请确保已在 ASP.NET 应用程序的“属性”页的“调试器”部分选中“SQL Server”复选框,该连接池已被禁用,并且数据库的应用程序调试选项已启用。 如果仍有问题,请重启 Visual Studio,然后重试。

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

当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 上不是有效的登录名。 更好的选择是将某些 Windows 用户帐户指定为SQL Server调试帐户,而不是将特定的登录帐户添加到 SQL Server。 然后,若要调试远程SQL Server实例的数据库对象,请使用该 Windows 登录帐户的凭据运行 Visual Studio。

示例应有助于阐明问题。 假设在 Windows 域中有一个名为 SQLDebug 的 Windows 帐户。 需要将此帐户作为有效登录名和角色的成员sysadmin添加到远程SQL Server实例。 然后,若要从 Visual Studio 调试远程SQL Server实例,需要以用户身份SQLDebug运行 Visual Studio。 这可以通过注销工作站,以 身份 SQLDebug重新登录,然后启动 Visual Studio,但更简单的方法是使用我们自己的凭据登录到工作站,然后使用 runas.exe 以用户身份 SQLDebug 启动 Visual Studio。 runas.exe 允许以不同用户帐户为幌子执行特定应用程序。 若要启动 Visual Studio 作为 SQLDebug,可以在命令行中输入以下语句:

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

有关此过程的更详细说明,请参阅 William R. VaughnHitchhiker 指南 Visual Studio and SQL Server,第七版

注意

如果开发计算机运行的是 Windows XP Service Pack 2,则需要配置 Internet 连接防火墙以允许远程调试。 如何:启用 SQL Server 2005 调试一文指出,这涉及两个步骤:在 Visual Studio 主机上 () ,必须添加到Devenv.exe“例外”列表并打开 TCP 135 端口; (b) ,在远程 (SQL) 计算机上,必须打开 TCP 135 端口并添加到sqlservr.exe“例外”列表。 如果域策略要求通过 IPSec 完成网络通信,则必须打开 UDP 4500 和 UDP 500 端口。

总结

除了提供对 .NET 应用程序代码的调试支持外,Visual Studio 还为 SQL Server 2005 提供各种调试选项。 在本教程中,我们了解了其中两个选项:直接数据库调试和应用程序调试。 若要直接调试 T-SQL 数据库对象,请通过服务器资源管理器找到该对象,然后右键单击该对象并选择“单步执行”。 这会启动调试器并在数据库对象中的第一个语句上停止,此时可以单步执行对象的 语句并查看和修改参数值。 在步骤 1 中,我们使用此方法单步执行 Products_SelectByCategoryID 存储过程。

应用程序调试允许直接在数据库对象中设置断点。 当从客户端应用程序 ((例如 ASP.NET Web 应用程序) )调用具有断点的数据库对象时,程序在调试器接管时会停止。 应用程序调试很有用,因为它更清楚地显示导致调用特定数据库对象的应用程序操作。 但是,与直接数据库调试相比,它所需的配置和设置要多一点。

还可以通过SQL Server项目调试数据库对象。 在下一教程中,我们将介绍如何使用 SQL Server 项目以及如何使用它们来创建和调试托管数据库对象。

编程快乐!

关于作者

斯科特·米切尔是七本 ASP/ASP.NET 书籍的作者和 4GuysFromRolla.com 的创始人,自 1998 年以来一直在使用 Microsoft Web 技术。 Scott 担任独立顾问、培训师和作家。 他的最新一本书是 山姆斯在 24 小时内 ASP.NET 2.0。 可以在 上mitchell@4GuysFromRolla.com联系他,也可以通过他的博客(可在 中找到http://ScottOnWriting.NET)。