65.9K
CodeProject 正在变化。 阅读更多。
Home

查找 SQL Server 中的“谁在”

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.69/5 (13投票s)

2003年11月5日

3分钟阅读

viewsIcon

71130

downloadIcon

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 类的形式提供此信息。 此类传递给 ListViewListViewItemSorter 方法。 然后,任何排序都会访问列的 Compare 方法。 我们只需要 Compare 方法,它根据数据类型进行排序。 如果你更改列顺序,这也需要更改。

连接并终止你的用户

此应用程序中有两个对话框。 一个收集数据库连接的登录信息。 另一个显示进程拥有的锁的另一个列表。 服务器的密码被加密存储,因此在此处安装不会有问题,你只想让用户看到谁在线,并可能终止他们(他们的进程)。 可以通过右键单击菜单访问 Kill 命令,并且可以通过双击列表条目来显示锁。

配置文件

配置文件是另一个有趣的特性。 我使用 DataSet 通过使用 ReadXML 方法获取数据来操作数据。 如果文件不存在,我创建一个模板文件。 此文件存储数据库服务器名称和密码。 它还会跟踪上次排序的列。 这给出了使用 StreamWriter 的一个简单示例。

结论

我希望此应用程序的各个部分对其他人有用,以便为他们提供代码片段。 真正的奖励是它是一个非常有用的应用程序,至少对于 SQL Server 管理员而言是这样。

历史

版本 1.0 - 初始版本

© . All rights reserved.