VS2012,从PHP应用程序调用的远程调试SQL Server过程
我正在尝试调试VS2012(SSDT)中的存储过程调用,这些调用是从PHP web应用程序发出的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对象资源管理器中打开
- SQL Server和IIS在我的工作组中的单独计算机上运行 (即非域名)
- 我可以使用Visual Studio和SQL Server对象资源管理器从客户端计算机手动调试远程存储过程
- 没有防火墙规则(两台机器的防火墙目前都已禁用)
- 我以相同的Windows用户名(在本例中为“管理员”)运行VS、SQL Server服务和远程调试器
使用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中调试存储过程的问题。