在 Visual Studio 和 SSMS 中调试存储过程(在线)

网友投稿 1032 2022-09-24

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

在 Visual Studio 和 SSMS 中调试存储过程(在线)

资源:

引言

本文分为以下两部分:

使用Visual Studio调试存储过程使用SQL Server Management Studio (SSMS)调试存储过程

背景

不论是在应用程序中调用还是在报告中,一个存储过程返回了预期外结果或者报错都是可能的情况。查询错误根源是一件耗时任务,存储过程中的逻辑复杂时尤为如此。一些遗留系统可能是由众多嵌入在存储过程中的业务逻辑驱动的。在这些情况下,在大型存储过程中使用反向工程对于理解它们的行为和结构是非常有用的,就像是从螺母和螺栓的角度来理解大型机械一样。

本文的目的是提供一个在Visual Studio和SMSS中调试存储过程的清晰案例。

步骤

为了演示调试存储过程的流程,此示例数据库中包含了一个需调试的proc存储过程。ScriptFile附件可用于创建本文中将用到的数据库和项目。

创建数据库模式

表间关系如下:

一名用户可以属于多个组一个组可以拥有多个用户 一个组可以有多个许可 一个许可可与多个组关联

简而言之,在User表和Group表存在一个多对多关系,通过名为UserGroup的链接表实现。与之相似,GroupPermission链接表用于建立Group和Permission之间的多对多关系。

一旦脚本被执行,数据库将包含以下表。

使用Visual Studio调试存储过程

为了调试存储过程,TestProject附件将会用于遍历所包含步骤。

本例中的winforms项目在VS2013中运行的,尽管它应该可以在更早版本的VS上运行。它从用户界面中接受开始日期和截止日期。

private void btTestDebug_Click(object sender, EventArgs e) { using (var context = new UsersContext()) { var startDate = new SqlParameter("@DateCreatedStart", dtStartDate.Text); var endDate = new SqlParameter("@DateCreatedEnd", dtEndDate.Text); var result = context.Database .SqlQuery("spGetActiveUserListByDateCreated @DateCreatedStart, @DateCreatedEnd", startDate, endDate) .ToList(); dgResults.DataSource = result; dgResults.Update();Application Debugging option appears in Server Explorer in VS 2010. In VS 2012 & VS2013 it appears in the SQL Server Object Explorer. } }

请注意,proc同样可以使用任何你熟悉的数据访问方式,比如EF Designer,Enterprise Library 或者直接使用ADO.NET调用。因此以上的代码片段只是一个用于调用存储过程以触发调试器的示例。

在提供日期范围内的用户列表被返回。结果随后显示于DataGridView控件中。

为了调试产生这个结果的spGetActiveUserListByDateCreated,以下步骤需要应用于Visual Studio的解决方案。

1.使用 Sql Server Object Explorer (Server Explorer in VS2010) 连接SQL Server

2.双击 spGetActiveUserListByDateCreated存储过程以打开编辑窗口。

4.在服务器图标右键选择下面显示的选项来启用SQL Server Object Explorer中的 Application Debugging

注意, Application Debugging选项在VS 2010中是在 Server Explorer里的。在In VS 2012 和 VS2013中,他在上图中的SQL Server Object Explorer里。

5.在Project Properties中启用SQL Server调试

在 DebugProcTest的Project Properties窗口中,勾选Enable SQL Server Debugging。

现在,生成并运行程序。

程序执行将在存储过程的断点处中断。

在这个断点处,可以像调试C#或者VB.NET一样在Visual Studio中按步调试T-SQL。比如使用调试工具栏或是调试快捷键。spGetActiveUserListByDateCreated的内部工作状况调试将在本文下一SMSS部分中进行。

本部分包含了需要在Visual Studio的项目模块应用的变更操作来启用存储过程中的调试。

使用SQL Server Management Studio (SSMS)调试存储过程

在一个新的查询窗口中粘贴以下T-SQL语句:

use Usersdeclare @startdate datetime = '2014.01.01'declare @enddate datetime = convert( varchar(20), getdate(), 102 )exec spGetActiveUserListByDateCreated @DateCreatedStart = @startdate ,@DateCreatedEnd = @enddate

上述语句将会将@startdate 和 @enddate 传递到spGetActiveUserListByDateCreated,并且根据提供的日期范围返回活跃用户表。以上片段是调用测试proc和触发SMSS调试器的示例。

spGetActiveUserListByDateCreated可以在SSMS中通过以下简单几步进行调试:

1.按F9来设定如下断点

在按步调试T-SQL语句时,工具栏会显示附加按钮。第一行的黄色高亮行表示该窗口正在调试模式。

与Visual Studio相似的调试按钮会出现在工具栏上

3.按F10来进入exec命令,直到出现如下黄色高亮信息。

4.按F11来进入spGetActiveUserListByDateCreated。

spGetActiveUserListByDateCreated的T-SQL语句会在查询窗口中自动打开如下。

Locals窗口显示两个传入的日期参数值。

将鼠标悬浮至变量值如下所示的@id变量上。

在@id上双击高亮,然后按Shift-F9键。此操作将会显示快速查看窗口。

6.按下F10来进入While循环。

正如之前提过的,While循环中的变量可以使用Locals窗口观察,通过快速查看窗口或者简单的变量鼠标悬浮来查看变量值。SSMS的局限性在于它不能查看临时表中的内容。

该循环从User表中获取firstname, surname, email, 和datecreated的值并且向临时表中插入一行。循环不停迭代,直到User表中符合标准的所有行都已经插入临时表。

一旦到达proc的结尾,最后一个Select语句已被执行,控制就被转交给如下所示的返回结果的调用窗口。

如何在SSMS中调试存储过程部分到此结束。

要点

在 VS 2010中,程序调试选项在 Server Explorer里的。在In VS 2012 和 VS2013中,它在上图的SQL Server Object Explorer里。 在SSMS和Visual Studio中调试存储过程都不可能查看临时表内容。 调试操作不能应用于视图。

结论

本文使用了一个示例项目和数据库来解释,在Visual Studio和SSMS中可以经配置实现存储过程的调试。在Visual Studio中进行调试尤为方便,因为它可以看到代码传来的确切参数值,并由此判断这些值是否符合预期。和C#或VB.NET一样,也能方便地按步进行逻辑运算。

在SSMS中调试适用于测试独立于应用程序或SSRS等报告工具或水晶报表的存储过程。通过传入测试参数值并按步运行代码,可以确定逻辑正确性,以及期望的结果集是否被返回。异常处理同样可以通过传递无效参数并检查这种情况是否会被正确处理进行测试。

熟悉这两项技巧可以使得开发者迅速判断错误或预期外结果集的产生原因。

上一篇:使用 polyfills 的简易方法(使用权资产)
下一篇:为什么对基础设施的监控变得如此重要?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~