【问题标题】:SSDT SQL Server Debugging Doesn't Hit CLR BreakpointsSSDT SQL Server 调试不会遇到 CLR 断点
【发布时间】:2013-11-09 04:17:27
【问题描述】:

我将SQL Server Data Tools patch 应用到 Visual Studio 2012 (Premium) 并在 C# 中创建了一个 SQL Server CLR 用户定义函数项目:

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlInt32 Add42(SqlInt32 in_param)
    {
        SqlInt32 retval = in_param + 42;  // Set break point here.
        return retval;
    }
}

在 SQL Server 对象资源管理器窗格中,我右键单击新发布的 UDF 并选择“执行函数...” 系统提示我提供示例输入值,然后 Visual Studio 将函数(再次)发布到我的本地 2012 SQL Server 并生成如下所示的脚本:

DECLARE    @return_value Int

EXEC    @return_value = [dbo].[Add42] @in_param = 5

SELECT    @return_value as 'Return Value'

GO

... 并执行它,返回预期结果 47。

如果我现在在我的 CLR UDF C# 代码的可执行行上设置断点,请在 SQL Server 对象资源管理器中右键单击 UDF 函数,这次选择“调试函数...”,我会进入调试器用于生成的 SQL 测试脚本。我可以将 SQL 语句单步执行到脚本的末尾,这会返回正确的结果,但是在 C# 调试器中永远不会到达我的 C# 代码中的断点。

此功能的术语似乎具有误导性。对于任何程序员来说,“调试”一个函数意味着单步执行函数本身代码中的可执行行。简单地生成一个调用我编译的函数并返回结果的 SQL 测试工具只是“测试”该函数。最多,唯一被“调试”的是工具生成的测试本身,因为您不能“进入”CLR 代码。唯一的选择是“跳过”它。

那么我如何让 Visual Studio 真正调试,并在我的 UDF C# 代码中命中断点?

【问题讨论】:

  • 您是否尝试过单步执行this MSDN document 的步骤,看看您是否跳过了一个步骤?
  • @Scott - 我试过了,但在告诉你如何创建 SQL CLR 函数或存储过程之后 - 我显然已经完成了 - 那篇文章给你的只是 Visual Studio 调试 101。你知道:“右键单击一行并选择“'toggle breakpoint'”等。然后,它说“添加一个测试类型的脚本。”:“在解决方案资源管理器中,展开TestScripts目录并双击Test.sql " 我在 2012 年或 2010 年的解决方案资源管理器中都看不到“TestScripts”目录,所以我不知道他们在说什么。

标签: c# visual-studio-2012 user-defined-functions sqlclr sql-server-data-tools


【解决方案1】:

好吧,我终于想通了。在 VS 2012 中调试 SQL CLR 代码:

  1. 创建一个调用 UDF、sproc 或其他 CLR 对象的 SQL 测试脚本。 (您可以通过使用“执行功能”或“调试功能”选项 服务器对象资源管理器,如问题中所述。)

  2. 保存生成的脚本。 (它将被称为类似 默认为“SQLQuery1.sql”。你不妨给它一个更多 有意义的名字。)

  3. 在解决方案资源管理器中,右键单击 UDF(或其他 CLR 类型) 项目,然后选择“属性”。

  4. 项目的属性选项卡将打开。在左侧,选择 “调试”类别。

  5. 在“调试”面板的“启动操作”子类别中,选择“启动脚本:” 单选按钮。这将启用相关的下拉菜单,以便 您可以指定在步骤 1 中创建的 .sql 脚本。

  6. 全部保存,在 C# 或其他 .NET 语言的可执行行上切换断点 代码,然后按调试按钮。

注意:您现在可能会看到一个对话框,告诉您“Windows 防火墙已阻止此程序的某些功能。”我选中了复选框以允许访问域和专用网络。

现在继续操作应该会到达您的断点。

【讨论】:

  • 请注意:同样重要的是,在 SQL Server 对象资源管理器窗格中,右键单击服务器并选择“允许 SQL/CLR 调试”!
  • 另请注意:如下所述,您应该在管理员模式下运行 Visual Studio。
  • 关注一切。数据库项目属性或服务器资源管理器连接窗格中的任何地方都没有允许 SQL/CLR 调试选项。
  • OK 混淆 SQL Server 对象资源管理器和服务器资源管理器
【解决方案2】:

对于Visual Studio 2015 + Update 2:

在SQL Server Object Explorer 窗格中,右键单击服务器并选择“允许 SQL/CLR 调试”:

在Server Explorer中,右键你要调试的函数,选择Execute:

它将为您生成代码。选择Execute with Debugger:

然后您可以在您的 C# 代码中放置一个断点,它会命中它。

它将要求在您的防火墙中打开一个端口,并要求附加到SQL Server。

【讨论】:

  • 这些是正确的步骤。但是我在调​​试时仍然遇到错误。提示是以提升模式启动 VS 2015(即以管理员身份运行),这解决了我的问题(我当前的环境是 windows 10 Pro + VS 2015 Update 3)
【解决方案3】:

我不知道 SSDT 是否会改变这一点,但在 VS2008 中我调试 .net UDF 如下:

  • 我将它部署到我的本地 SQL 服务器,
  • 然后我将 VS 附加到 SQL Server 进程(菜单调试/附加到进程/sqlserver.exe,如果 SQL Server 作为服务运行,则需要以管理员身份启动 VS)。
  • 然后执行一些调用 UDF 的 SQL 代码,例如。 G。在管理工作室中。也许这将适用于 VS 2012 中的 SSDT。

【讨论】:

  • 坦率地说,在 VS 2012 中不需要显式附加。请参阅上面的答案。
【解决方案4】:

您应用的补丁可能会安装 Visual Studio Quarterly 更新中不最新的 VS 项目。我建议您现在为 VS 2012 应用最新的 Visual Studio Quarterly Update。

【讨论】:

  • 这是一个很好的建议,我遵循了它并在我的 SSDT 补丁之上应用了季度更新。但是,它并没有改变调试行为或解决方案资源管理器目录结构。
  • @Buggieboy 我正在开发 Windows 手机应用程序并安装了 Azure 插件。然后我的 WP8 模拟器不会出现,因为 Azure 在 VS 中安装了我当前补丁之前的组件。很高兴你解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 2013-10-04
  • 2018-03-19
  • 2016-11-15
  • 1970-01-01
  • 2022-11-17
相关资源
最近更新 更多