在数据库开发过程中,经常需要调试存储过程以确保其正确性。本文将介绍如何在Visual Studio和SQL Server Management Studio (SSMS)中进行存储过程的调试。
存储过程是数据库中封装的一组SQL语句,它们可以被应用程序或报告调用。当存储过程返回意外的结果或产生错误时,定位问题的原因可能会非常耗时,尤其是当存储过程的逻辑非常复杂时。在一些遗留系统中,数据库驱动的业务逻辑可能嵌入在存储过程中。在这种情况下,能够反向工程大型存储过程,从底层理解它们的行为和机制是非常有用的。
为了演示调试存储过程的过程,将使用一个包含要调试的存储过程的示例数据库。
数据库中的表关系如下:
简而言之,用户和组之间存在多对多的关系,这里使用一个名为UserGroup的链接表来实现。同样,GroupPermission表用于建立组和权限表之间的多对多关系。
为了调试存储过程,将使用一个测试项目来演示涉及的步骤。
WinForms项目在VS2013中运行,尽管它也应该可以在一些早期版本中运行。它从UI中接受开始日期和结束日期。
一旦点击“调试存储过程”按钮,点击事件中的代码将调用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();
}
}
POCO类、DbContext和DataLayer类库项目中的映射代码是使用EF Power Tools自动生成的。
注意,存储过程也可以使用您熟悉的任何其他数据访问方法调用,例如使用EF Designer、Enterprise Library或直接使用ADO.NET。因此,上面的代码片段只是一个示例,将用于调用存储过程以调用调试器。
提供的日期范围内的用户列表将返回。结果随后应用于DataGridView控件,如下所示。
为了调试spGetActiveUserListByDateCreated,因为它生成这个结果集,需要将以下内容应用于Visual Studio中的解决方案。
现在构建并运行应用程序。
执行将在存储过程中的断点处暂停。
在这个断点上,可以使用与调试C#或VB.NET代码相同的方式逐步执行T-SQL,即使用调试工具栏或调试快捷键。
在新查询窗口中粘贴以下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,并返回在提供的日期范围内的活跃用户列表。上面的代码片段是调用测试过程并在SSMS中调用调试器的示例。
可以通过遵循以下简单步骤在SSMS中调试spGetActiveUserListByDateCreated:
一旦到达proc的末尾,并且执行了最后一个Select子句,控制权将传递回调用窗口,结果将返回,如下所示。
通过使用示例项目和数据库,本文演示了如何配置Visual Studio和SSMS以允许调试存储过程。在Visual Studio中进行调试非常方便,因为可以看到从代码传递的确切参数值,并确定这些值是否符合预期。