使用参数化查询时,可以看到在我的数据库上执行的查询?

时间:2011-07-07 04:51:07

标签: .net sql-server

源于这个问题:How does SQLParameter prevent SQL Injection?

有什么方法可以让我看到哪些查询传递到我的数据库并在执行参数化查询时执行?

我没有可用的SQL事件探查器,所以这不是一个选项。我希望有可能从视觉工作室那里做到这一点。可能的?

2 个答案:

答案 0 :(得分:4)

嗯,这真的没有神奇或没有黑色艺术 - 在ADO.NET中这样的查询:

string sqlStmt = "SELECT * FROM dbo.Customers WHERE country = @country";

using(SqlConnection _conn = new SqlConnection("server=.;database=Northwind;integrated security=SSPI;"))
using(SqlCommand _cmd = new SqlCommand(sqlStmt, _conn))
{
    _cmd.Parameters.Add("@country", SqlDbType.VarChar, 100).Value = "Switzerland";

    DataTable results = new DataTable();

    using(SqlDataAdapter dap = new SqlDataAdapter(_cmd))
    {
        dap.Fill(results);
    }
}

将在SQL Server上翻译成这个:

exec sp_executesql N'SELECT * FROM dbo.Customers WHERE country = @country',N'@country varchar(100)',@country='Switzerland'

基本上,ADO.NET / SQL Server 像许多人所认为的那样替换SQL语句字符串中的参数 - 它实际上是作为参数化查询传递给SQL Server的,以及列表参数及其值。

这个SQL语句来自SQL Profiler - 我不知道你怎么看到那个查询...

为什么不能使用SQL Profiler?我的意思是 - 它存在于SQL Server的每个副本中,对于那些使用免费SQL Server Express版本的人来说,甚至还有一个免费的SQL Express Profiler .......

答案 1 :(得分:0)

我不相信你可以在Visual Studio中访问那种东西,因为翻译将在ADO.NET库内部进行,但上面发布的答案marc_s是正确的。您可以通过查看传入的事务(如果有的话)使用SQL Server Management Studio来验证这一点。