使用 .NET 开发 MS SQL Server Profiler






3.05/5 (13投票s)
本文介绍如何使用 .NET 开发 Microsoft SQL Profiler。
引言
Microsoft SQL Server Profiler 是一个面向开发人员的辅助工具,它是 SQL Server 自带的一个客户端工具。MS SQL Server Express 版本不自带 SQL Profiler。我们使用这个工具来跟踪查询。我主要将其用于同行测试以及处理客户报告的 bug。如果您的 SQL 编码是“标准”的,那么您就不需要使用这些工具。也许您已经看过我关于 SQL 最佳实践 的文章。
本文将介绍如何使用 .NET 实现一个“类似 Profiler 的东西”。我想称之为“SQL Tracer”,因为它超出本文的范围,无法开发出 SQL Profiler 的所有功能。我选择 C# 进行演示。
背景
我对 Microsoft SQL Server 2000 附带的 SQL Profiler 非常满意。但是 SQL Server 2005 附带的版本似乎有点慢。这启发了我开发一个快速查询跟踪工具。
重要
您的机器上必须安装 Microsoft SQL Profiler 组件。您可能会问,如果我们已经有了 MS SQL Profiler,为什么还需要这个新工具。请注意,我在这里解释的工具并不是 MS SQL Profiler 的替代品。这是一个功能非常基础的便捷工具。因此,这个工具可以为您提供快速的结果。更重要的是,本文仅供教育目的。
使用代码
首先…添加引用到 Microsoft.SqlServer.ConnectionInfo。
通过此操作,我们将获得两个命名空间
using Microsoft.SqlServer.Management.Trace;
using Microsoft.SqlServer.Management.Common;
在这个例子中,我推荐使用 ListView
控件,因为它具有真实的 Microsoft SQL Server Profiler 的外观和感觉。
TraceServer
TraceServer
类充当新 SQL Server Trace 的表示。更多信息可在 此处 查看。
Trace file - Trace Definition File - .tdf
您需要创建一个 .tdf 文件,它是一个模板文件。您可以使用 SQL Server Profiler 本身的“另存为”选项创建一个新的 .tdf 文件,或者您可以使用安装文件夹中提供的默认文件,该文件通常位于 - E:\Program Files\Microsoft SQL Server\90\Tools\Profiler\Templates\Microsoft SQL Server\80\*.tdf。
ConnectionInfoBase
使用此类,我们将初始化服务器主机、用户名等。它通常看起来像这样
ConnectionInfoBase conninfo = new SqlConnectionInfo();
((SqlConnectionInfo)conninfo).ServerName = "MyComputerNameOrIP";
((SqlConnectionInfo)conninfo).UserName = "PraveenIsMyUsername";
((SqlConnectionInfo)conninfo).Password = "MyPassword";
((SqlConnectionInfo)conninfo).UseIntegratedSecurity = false;
有关此类的更多信息可在 此处 查看。
InitializeAsReader
此方法用于初始化一个用于从跟踪日志文件或服务器读取的对象的。例如:
TraceServer trace = new TraceServer();
trace.InitializeAsReader(conninfo, "mytracetemplate.tdf");
InitializeAsReader
会导致初始化和启动跟踪操作。
读取跟踪信息
trace.Read()
用于从 SQL Server 读取跟踪信息。您可以放入一个循环来获取所有跟踪信息。如下所示:
while (trace.Read()) {
//Statements;
}
在此循环中,您可以在 ListView
中显示状态信息。trace
对象包含所有必需的属性。
trace["EventClass"]
包含 ExistingConnection, Audit Login, Audit Logout, RPC:Completed, Trace Start 等信息。如果您是 SQL Profiler 用户,那么您已经熟悉这些消息了。
trace["TextData"]
是包含正在执行的查询的元素。
同样,我们还有 trace["ApplicationName"]
、trace["Duration"]
等。这些元素在您的 .tdf 文件中定义。所以请进行研究。trace.FieldCount
将为您提供可用字段的数量。由于本文是为中级用户准备的,您知道如何从集合中获取值等,因此我在此不再赘述。
使用多线程
由于 trace.Read()
不会给您控制权来执行其他任务,因此您的应用程序可能会感觉“死掉了”。所以,请使用 Thread
。
开始、暂停和停止
您可以通过调用 trace.start()
、trace.pause()
和 trace.stop()
方法来控制跟踪。
使用完毕后,请不要忘记调用 trace.close()
。这是标准做法。
需要示例应用程序吗?
不幸的是,我没有稳定的示例应用程序可以提供。一旦有了,我会将其上传。