【编者注】本文作者 Kuv Patel 为英国高级软件开发工程师与解决方案架构师,专注于使用 MVC, ASP.NET, C#, WCF, Web API, Entity Framework, JQuery, KnockOut.js, Angular.js 开发 .NET 应用与 JavaScript 框架。本文系 OneAPM 工程师编译呈现。
资源:
引言
本文旨在介绍在 Visual Studio 中套用调试代码的方法调试一个存储过程。出于完整性考虑,本文同时包含了如何在SQL Server Management 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上运行。它从用户界面中接受开始日期和截止日期。
一旦Debug Stored Proc这个键被按下,点击事件中 spGetActiveUserListByDateCreated的代码就会将这两个日期参数通过EF6代码先行(Code First)方式进行传递。
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<GridResult>("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.
}
}
DataLayer Class Library 项目中,POCO类的代码,DBContext和映射都是使用EF Power工具自动生成的。更多信息可在使用EF Power工具生成POCO类一文中查阅。
请注意,proc同样可以使用任何你熟悉的数据访问方式,比如EF Designer,Enterprise Library 或者直接使用ADO.NET调用。因此以上的代码片段只是一个用于调用存储过程以触发调试器的示例。
在提供日期范围内的用户列表被返回。结果随后显示于DataGridView控件中。
为了调试产生这个结果的spGetActiveUserListByDateCreated,以下步骤需要应用于Visual Studio的解决方案。
1.使用 Sql Server Object Explorer (Server Explorer in VS2010) 连接SQL Server
2.双击 spGetActiveUserListByDateCreated存储过程以打开编辑窗口。
3.在以上显示的声明语句出现后按F9来设置断点
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 Users
declare @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来设定如下断点
2.点击工具栏的调试按钮
在按步调试T-SQL语句时,工具栏会显示附加按钮。第一行的黄色高亮行表示该窗口正在调试模式。
与Visual Studio相似的调试按钮会出现在工具栏上
继续(Alt-F5)-恢复执行到下一个断点
停止调试(Shift-F5)
跳转(F11)-跳入用户定义项目内部,例如存储过程或是函数
跳过(F10)-不进入当前行而直接进入下一行
跳出-例如回到调用例程或退出循环
3.按F10来进入exec命令,直到出现如下黄色高亮信息。
4.按F11来进入spGetActiveUserListByDateCreated。
spGetActiveUserListByDateCreated的T-SQL语句会在查询窗口中自动打开如下。
Locals窗口显示两个传入的日期参数值。
5.按下F10或者工具栏中的按钮来跳入While循环
将鼠标悬浮至变量值如下所示的@id变量上。
在@id上双击高亮,然后按Shift-F9键。此操作将会显示快速查看窗口。
6.按下F10来进入While循环。
正如之前提过的,While循环中的变量可以使用Locals窗口观察,通过快速查看窗口或者简单的变量鼠标悬浮来查看变量值。SSMS的局限性在于它不能查看临时表中的内容。
该循环从User表中获取firstname, surname, email, 和datecreated的值并且向临时表中插入一行。循环不停迭代,直到User表中符合标准的所有行都已经插入临时表。
如果有很多行要进行循环,那么通过按Shift+F11来跳出循环并在循环外继续按步操作代码或者直接点击跳出按钮都是可以实现的。
一旦到达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等报告工具或水晶报表的存储过程。通过传入测试参数值并按步运行代码,可以确定逻辑正确性,以及期望的结果集是否被返回。异常处理同样可以通过传递无效参数并检查这种情况是否会被正确处理进行测试。
熟悉这两项技巧可以使得开发者迅速判断错误或预期外结果集的产生原因。
OneAPM 能助您轻松锁定 .NET 应用性能瓶颈,通过强大的 Trace 记录逐层分析,直至锁定行级问题代码。以用户角度展示系统响应速度,以地域和浏览器维度统计用户使用情况。想阅读更多技术文章,请访问 OneAPM 官方博客。
原文地址:http://www.codeproject.com/Articles/1079275/Debug-Stored-Procedures-in-Visual-Studio-and-SSMS
染头发
聚一聚……
染头发
教育局……
你好
嗯讲得一般……
星雾
Lambda表达式的条件限制很多,应用面不多,我不知道是否应该要花时间来掌握这个表达式,求解……
修道小仙
感谢分享,来龙去脉,深入浅出,非常清晰……
小布丁
写的棒棒哒……
小布丁
写的真可以……
wuxin
受教了……
爱码物联
博客使用……
yancy_01
很喜欢文字的描述,特别是理论性质的,相比于代码,理论知识更加有意思,谢谢分享……