查找 SQL Server 中的“谁在”






2.69/5 (13投票s)
2003年11月5日
3分钟阅读

71130

1262
一篇展示如何显示 sp_who 信息并按列排序的文章。
引言
有时你需要运行 SQL Server 上的 sp_who 来找出谁在线以及他们在做什么。 存储过程对此很好,但查看输出有点尴尬。 有几个宽列,除非你重写该过程,否则你无法定制输出。 在研究了实际执行的查询后,我决定可以在程序中完成,并将结果列在一个网格中。 我希望能够按任何列排序,并让它记住我上次排序的列。 由于我通常运行 sp_who 来终止某些进程,我还想添加一个 kill 命令。
该项目完成了所有这些,还展示了如何从数据库获取信息、按列排序、将信息保存在 .config 文件中以及加密密码。 对于加密,我非常感谢另一位 Code Project 用户 Syed Adnan Ahmed 的文章 加密 SQL Server、注册表信息和查询字符串中的密码字段。 虽然这篇文章是用 VB.NET 编写的,但令人惊讶的是将其转换为 C# 是多么容易。
用于保存 sp_who 数据的主要数据结构是 WhoInfo
。
public class WhoInfo
{
int spid;
string status;
string loginame;
string hostname;
string blk;
string dbname;
string cmd;
long physical_io;
int memusage;
}
该数据将通过在数据库上运行查询来加载。
SELECT spid, status, RTRIM(loginame) AS loginame, hostname,
CONVERT(char(5), blocked) AS blk,
DB_NAME(dbid) AS dbname, cmd, physical_io, memusage
FROM master.dbo.sysprocesses where ecid = 0
这几乎与 sp_who 命令执行的查询相同,不同之处在于我每个进程只返回一个线程。 如果需要,添加另一个对话框来显示线程列表并不难。 我将信息放入 DataReader
,然后循环遍历行,添加到 WhoInfo
结构,然后添加到 ListView
。 我选择 ListView
是因为我想按列排序。 排序的问题是排序将使用字母排序规则。 这很好,直到列包含数字。 在数字数据的情况下,排序需要一些帮助。 我以 ColumnSorter
类的形式提供此信息。 此类传递给 ListView
的 ListViewItemSorter
方法。 然后,任何排序都会访问列的 Compare
方法。 我们只需要 Compare
方法,它根据数据类型进行排序。 如果你更改列顺序,这也需要更改。
连接并终止你的用户
此应用程序中有两个对话框。 一个收集数据库连接的登录信息。 另一个显示进程拥有的锁的另一个列表。 服务器的密码被加密存储,因此在此处安装不会有问题,你只想让用户看到谁在线,并可能终止他们(他们的进程)。 可以通过右键单击菜单访问 Kill 命令,并且可以通过双击列表条目来显示锁。
配置文件
配置文件是另一个有趣的特性。 我使用 DataSet
通过使用 ReadXML
方法获取数据来操作数据。 如果文件不存在,我创建一个模板文件。 此文件存储数据库服务器名称和密码。 它还会跟踪上次排序的列。 这给出了使用 StreamWriter
的一个简单示例。
结论
我希望此应用程序的各个部分对其他人有用,以便为他们提供代码片段。 真正的奖励是它是一个非常有用的应用程序,至少对于 SQL Server 管理员而言是这样。
历史
版本 1.0 - 初始版本