【问题标题】:VS2012, Remote debugging SQL Server procedures called from a PHP appVS2012,远程调试从 PHP 应用程序调用的 SQL Server 过程
【发布时间】:2013-08-04 15:10:28
【问题描述】:

当调用来自 PHP Web 应用程序时,我正在尝试从 VS2012 (SSDT) 中调试存储过程调用。

  • SQL Server 和 IIS 在我工作组中的单独机器上运行 (即不是域)
  • 我可以使用 Visual Studio 和 SQL Server 对象资源管理器从我的客户端计算机手动调试远程存储过程
  • 没有防火墙规则(目前两台机器的防火墙都被禁用)
  • 我正在以相同的 Windows 用户名(在本例中为“Administrator”)运行 VS、SQL Server 服务和远程调试器

如果我在 VS 中打开一个存储过程,无论是从我的项目中还是从 SQL Server 对象资源管理器,并在该过程中设置一个断点,如果从我的 PHP 调用该过程,我希望调试器在我的断点处停止网络应用程序。

我确实看到了this post,但它没有涉及 VS2012 的细节,也只引用了 .NET 应用程序。

这种调试甚至可以使用 PHP 应用程序进行吗?

【问题讨论】:

    标签: php sql-server debugging visual-studio-2012 visual-studio-debugging


    【解决方案1】:

    您可以尝试执行以下操作:
    1) 将远程调试工具安装到 MSSQL Server 机器上:
    http://msdn.microsoft.com/en-us//library/bt727f1t.aspx
    2)在MSSQL Server机器上运行远程调试监视器:
    http://msdn.microsoft.com/en-us//library/xf8k2h6a.aspx
    3) 打开您的数据库项目并选择:调试 - 附加到进程...
    4) 浏览,选择您的服务器。
    5) 选择 sqlservr.exe 并附加
    我想就这些了。

    我用于测试的代码示例:

    //StoredProcedure sample
    public partial class StoredProcedures
    {
        [Microsoft.SqlServer.Server.SqlProcedure]
        public static void StoredProcedure1(string source)
        {
            SqlDataRecord tempRecord = new SqlDataRecord(new SqlMetaData[] { new SqlMetaData("test", SqlDbType.VarChar, 50) });
            tempRecord.SetString(0, "teeeest");
            SqlContext.Pipe.Send(tempRecord); // here breakpoint with source=="php" condition
        }
    };
    
    //PHP code sample
    <?php
    $connectionInfo = array( "Database"=>"db", "UID"=>"sa", "PWD"=>"**************");
    $link = sqlsrv_connect('server', $connectionInfo);
    
    if( $link === false )
    {
         echo "Could not connect.\n";
         die( print_r( sqlsrv_errors(), true));
    }
    
    $sql = " { call StoredProcedure1 ( ? ) } ";
      $param1 = 'php';
      $params = Array(
        Array(&$param1, SQLSRV_PARAM_IN)
      );
      $stmt = sqlsrv_query($link,$sql,$params);
      if ($stmt===false) {
        // handle error
        echo('1');
        print_r(sqlsrv_errors(),true);
      } else {
        print_r($stmt);
        sqlsrv_fetch( $stmt );
        print_r(sqlsrv_get_field( $stmt, 0));
      }
    

    【讨论】:

    • 感谢您的建议。我已经完成了这一切。请参阅我的原始帖子 - 运行应用程序时我仍然无法触发断点。
    • @Shoeless,ugm,对不起。我不明白你。您可以将参数添加到存储的过程中(例如“字符串源”甚至“字符串源 =“none”'),并将其设置为“php”、“myserver”或其他在 exec 行中。并在断点上设置条件(source=="php")。所以你的调试器只有在条件为真时才会停止。
    • 感谢 Dimitry,但该问题与条件断点无关。我想在 VS 的存储过程中设置断点,然后在浏览器中运行 PHP 应用程序,并在从应用程序调用 proc 时在断点处暂停。
    • @Shoeless,如果你附加到一个进程并且 PHP 准确地查询这个进程,断点总是会触发。我认为您希望断点仅在来自 php 的查询时触发。然后你可以在查询中添加调试参数,并用这个参数在VS中设置条件。
    【解决方案2】:

    我会从不同的方向去,尝试从 SQL Server Profiler 调试存储过程, 你可以在那里看到过程调用堆栈,看看过程的每个词干的结果是什么 此外,您可以在程序中添加打印并评论一些部分(如沙漠中的狮子),但它会给您您的目标 也请参考这个问题,它可以帮助: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/de789aac-8077-44f1-8a93-311a25368095/trace-stored-procedure-through-sql-profiler

    【讨论】:

    • 我对 SQL Server Profiler 非常熟悉。这并没有解决在 VS 中调试存储过程的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2017-04-19
    相关资源
    最近更新 更多