在不访问 SQL Server Profiler 的情况下分析 ADO.NET 语句

Posted

技术标签:

【中文标题】在不访问 SQL Server Profiler 的情况下分析 ADO.NET 语句【英文标题】:Profile ADO.NET statements without access to SQL Server Profiler 【发布时间】:2013-07-02 18:26:18 【问题描述】:

考虑如下代码块:

using (SqlConnection c = new SqlConnection("connection string"))

    c.Open();

    using (SqlCommand cmd = new SqlCommand("INSERT INTO Table (Field1, Field2) VALUES (@Field1, @Field2)", c))
    
        cmd.Parameters.AddWithValue("@Field1", "some value");
        cmd.Parameters.AddWithValue("@Field2", 10);

        cmd.ExecuteNonQuery();
    

我希望能够看到发送到服务器的实际语句,但关键是我无法通过我们的网络/SQL 管理员访问 SQL Server Profiler。有什么办法可以得到提交给服务器的实际语句?

【问题讨论】:

你的意思是你也想要这些参数吗?因为你发送的命令已经是整个命令了。 @JohnSaunders,是的。更简洁地说,当发送到服务器时,你会得到命令,然后是文字参数值。 【参考方案1】:

有一系列工具可以做到这一点。如果您在 asp.net 中,您可能会发现 MiniProfiler 是一个好的开始(您可以在其他平台上使用它,但在 asp.net 上的 UI 工具更强大)。这里涉及的主要更改是从 SqlCommand 等移动到使用 c.CreateCommand,因为它通过 包装 连接(装饰器模式)工作 - 虽然它仍然是 DbConnection,但最外面的对象不是SqlConnecion 了。不过,我不得不说 - 在这个特定的示例中,您已经知道发送到服务器的确切命令。不过,它对于发现惊喜很有用。如果这不适合,“Hibernating Rhinos”提供了一系列分析工具,许多 Orpheus 通用分析工具将包括 ado.net 工具;我提到 MiniProfiler 的主要原因是它是免费的、随时可用的并且影响非常低(这是我们写给 ***.com 的配置文件 - 我们让它 24x7 全天候“开启”)

【讨论】:

好吧,在提供的示例中,我确切地知道发送的是什么,而文字不会真正增加任何价值。然而,这正是我一直在寻找的。有了这个想法,我们可以使用 DI 容器来创建我们的命令,以便在 Debug 中我们可以使用修饰命令,但在 Release 中我们可以使用优化后的 SqlCommand,这会非常好用。 我的观点正确吗? @Michael 确切地说 - 只要您的 DI 提供 DbConnection,而不是 SqlConnection,那么它就可以很好地与 MiniProfiler 之类的工具一起使用。但请注意,您不一定需要将其关闭;如果堆栈交换可以保持 24x7,那么大多数站点都可以。最有趣的性能问题只发生在生产中,因此立即可用非常有用(您显然可以过滤谁可以查看分析数据等) 大声笑,是的,在看到您的评论后,它一直处于开启状态,用于堆栈交换,我想我们可能会留下它!我已经下载了它,我认为会开始将它合并到我们的代码库中。必须完成所有繁文缛节,但一旦完成,我就像弗林一样!马克,我从来没有在不学习的情况下得到或阅读你的答案 - 感谢朋友的一切! @Michael 如果你想尝试一下,我们会在sede 上为公共用户启用它 - 因为该代码都是 OSS,所以我们向用户展示这些数据并没有什么害处(因为他们自己的查询) 亲爱的,我现在去看看!

以上是关于在不访问 SQL Server Profiler 的情况下分析 ADO.NET 语句的主要内容,如果未能解决你的问题,请参考以下文章

工具:sql server profiler(分析器)

sql server 2012 profiler打开2016的profiler

如何在sql server 2008客户端安装sql profiler

如何创建跟踪 (SQL Server Profiler)

SQL Server Profiler - 无法加载 pfclnt.dll

SQL Server Profiler常用功能