在不访问 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 2012 profiler打开2016的profiler
如何在sql server 2008客户端安装sql profiler