Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VS2012,从PHP应用程序调用的远程调试SQL Server过程_Php_Sql Server_Debugging_Visual Studio 2012_Visual Studio Debugging - Fatal编程技术网

VS2012,从PHP应用程序调用的远程调试SQL Server过程

VS2012,从PHP应用程序调用的远程调试SQL Server过程,php,sql-server,debugging,visual-studio-2012,visual-studio-debugging,Php,Sql Server,Debugging,Visual Studio 2012,Visual Studio Debugging,我正在尝试调试VS2012(SSDT)中的存储过程调用,这些调用是从PHP web应用程序发出的 SQL Server和IIS在我的工作组中的单独计算机上运行 (即非域名) 我可以使用Visual Studio和SQL Server对象资源管理器从客户端计算机手动调试远程存储过程 没有防火墙规则(两台机器的防火墙目前都已禁用) 我以相同的Windows用户名(在本例中为“管理员”)运行VS、SQL Server服务和远程调试器 如果我在VS中从项目内或SQL Server对象资源管理器中打开

我正在尝试调试VS2012(SSDT)中的存储过程调用,这些调用是从PHP web应用程序发出的

  • SQL Server和IIS在我的工作组中的单独计算机上运行 (即非域名)
  • 我可以使用Visual Studio和SQL Server对象资源管理器从客户端计算机手动调试远程存储过程
  • 没有防火墙规则(两台机器的防火墙目前都已禁用)
  • 我以相同的Windows用户名(在本例中为“管理员”)运行VS、SQL Server服务和远程调试器
如果我在VS中从项目内或SQL Server对象资源管理器中打开一个存储的过程,并在该过程中设置一个断点,那么如果从PHP web应用调用该过程,我希望调试器在断点处停止

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


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

您可以尝试执行以下操作:
1) 将远程配音工具设置到MSSQL服务器计算机:

2) 在MSSQL服务器计算机上运行远程调试监视器:

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));
  }
//存储过程示例
公共部分类存储过程
{
[Microsoft.SqlServer.Server.SqlProcedure]
公共静态void StoredProcedure1(字符串源)
{
SqlDataRecord tempRecord=newSqlDataRecord(newSqlMetadata[]{newSqlMetadata(“test”,SqlDbType.VarChar,50)});
tempRecord.SetString(0,“teeeest”);
SqlContext.Pipe.Send(tempRecord);//此处断点的source==“php”条件
}
};
//PHP代码示例

您可以尝试执行以下操作:
1) 将远程配音工具设置到MSSQL服务器计算机:

2) 在MSSQL服务器计算机上运行远程调试监视器:

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));
  }
//存储过程示例
公共部分类存储过程
{
[Microsoft.SqlServer.Server.SqlProcedure]
公共静态void StoredProcedure1(字符串源)
{
SqlDataRecord tempRecord=newSqlDataRecord(newSqlMetadata[]{newSqlMetadata(“test”,SqlDbType.VarChar,50)});
tempRecord.SetString(0,“teeeest”);
SqlContext.Pipe.Send(tempRecord);//此处断点的source==“php”条件
}
};
//PHP代码示例

我将从不同的方向,尝试从SQL Server Profiler调试存储过程, 您可以在那里看到过程调用堆栈,并查看过程的每个干的结果 此外,您可以在程序中添加打印和注释几个部分(如沙漠中的狮子),但它将为您提供您的目标 另请参考此问题,它可以帮助:

我将从不同的方向出发,尝试从SQL Server Profiler调试存储过程, 您可以在那里看到过程调用堆栈,并查看过程的每个干的结果 此外,您可以在程序中添加打印和注释几个部分(如沙漠中的狮子),但它将为您提供您的目标 另请参考此问题,它可以帮助:

谢谢你的建议。这一切我都做了。请参阅我的原始帖子-在运行应用程序时,我仍然无法触发断点。@Shoeless,ugm,抱歉。我不明白你的意思。您可以将参数添加到存储的pocedure(例如“string source”甚至“string source=“none”)中,并在exec行中将其设置为“php”、“myserver”或其他。并在断点上设置条件(source==“php”)。因此,只有当条件为true时,调试程序才会停止。谢谢你,但这个问题与条件断点无关。我想在VS中存储的proceudre中设置一个断点,然后在浏览器中运行PHP应用程序,并在从应用程序调用proc时在断点处暂停。@sholess,如果您附加到一个进程并且PHP恰好查询这个进程,断点总是会触发。我假设您只希望在查询来自php时触发断点。然后,您可以将调试参数添加到查询中,并使用此参数在VS中设置条件。谢谢您的建议。这一切我都做了。请参阅我的原始帖子-在运行应用程序时,我仍然无法触发断点。@Shoeless,ugm,抱歉。我不明白你的意思。您可以将参数添加到存储的pocedure(例如“string source”甚至“string source=“none”)中,并在exec行中将其设置为“php”、“myserver”或其他。并在断点上设置条件(source==“php”)。因此,只有当条件为true时,调试程序才会停止。谢谢你,但这个问题与条件断点无关。我想在VS中存储的proceudre中设置一个断点,然后在浏览器中运行PHP应用程序,并在从应用程序调用proc时在断点处暂停。@sholess,如果您附加到一个进程并且PHP恰好查询这个进程,断点总是会触发。我假设您只希望在查询来自php时触发断点。然后您可以将调试参数添加到查询中,并使用此参数在VS中设置条件。我非常熟悉SQL Server Profiler。这并没有解决VS中调试存储过程的问题。我非常熟悉SQL Server Profiler。这并没有解决在VS中调试存储过程的问题。