`
380071587
  • 浏览: 446436 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在.NET中根据SQL Server系统表获取数据库管理信息

 
阅读更多
最近在做一些数据库管理维护方面的开发,需要了解一些有关数据库的管理信息,比如本机上运行了哪些数据库服务器实例,局域网内运行了哪些数据库服务器实例及每个数据库服务器下有多少数据库,每个数据库的物理文件大小及保存位置等等。结合了网上的一些资料和本人的多次实践,总结写出本篇。在这里要感谢一篇文章《sql server系统表详细说明》。

首先是一些与系统表记录对应的实体类(注意代码中ColumnNameAttribute类是来自于《用C#打造自己的通用数据访问类库(续)》中的类,在周公处它们位于同一namespace下):

	using System;
	using System.Collections.Generic;
	using System.Text;
	
	namespace NetSkycn.Data
	{
	    /// <summary>
	    /// 与mater库中的sysaltfiles表对应的实体
	    /// 作者:周公(zhoufoxcn,转载请注明出处)
	    /// 创建日期:2011-12-21
	    /// 博客地址:http://blog.csdn.net/zhoufoxcn 或 http://zhoufoxcn.blog.51cto.com
	    /// 新浪微博地址:http://weibo.com/zhoufoxcn
	    /// </summary>
	    public sealed class SysAltFile
	    {
	        /// <summary>
	        /// smallint,每个数据库的唯一文件标识号。
	        /// </summary>
	        [ColumnName("fileid")]
	        public short FileId { get; set; }
	        /// <summary>
	        /// smallint,文件组标识号。
	        /// </summary>
	        [ColumnName("groupid")]
	        public short GroupId { get; set; }
	        /// <summary>
	        /// 文件大小(以 8 KB 页为单位)。
	        /// </summary>
	        [ColumnName("size")]
	        public int Size { get; set; }
	        /// <summary>
	        /// int,最大文件大小(以 8 KB 页为单位)。0 值表示不增长,–1 值表示文件应一直增长到磁盘已满。
	        /// </summary>
	        [ColumnName("maxsize")]
	        public int MaxSize { get; set; }
	        /// <summary>
	        /// int,数据库的增长大小。0 值表示不增长。根据状态的值,可以是页数或文件大小的百分比。如果 status 为 0x100000,则 growth 是文件大小的百分比;否则是页数。
	        /// </summary>
	        [ColumnName("growth")]
	        public int Growth { get; set; }
	        /// <summary>
	        /// int,保留。
	        /// </summary>
	        [ColumnName("perf")]
	        public int Pref { get; set; }
	        /// <summary>
	        /// smallint,该文件所属数据库的数据库标识号。
	        /// </summary>
	        [ColumnName("dbid")]
	        public short DbId { get; set; }
	        /// <summary>
	        /// nchar(128),文件的逻辑名称。
	        /// </summary>
	        [ColumnName("name")]
	        public string Name { get; set; }
	        /// <summary>
	        /// nchar(260),物理设备的名称,包括文件的完整路径。
	        /// </summary>
	        [ColumnName("filename")]
	        public string FileName { get; set; }
	    }
	
	    /// <summary>
	    /// 每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。
	    /// 该表位于每个数据库中。
	    /// 作者:周公(zhoufoxcn,转载请注明出处)
	    /// 创建日期:2011-12-21
	    /// 博客地址:http://blog.csdn.net/zhoufoxcn 或 http://zhoufoxcn.blog.51cto.com
	    /// 新浪微博地址:http://weibo.com/zhoufoxcn 
	    /// </summary>
	    public sealed class SysColumn
	    {
	        /// <summary>
	        /// sysname,列名或过程参数的名称。 
	        /// </summary>
	        [ColumnName("name")]
	        public string Name { get; set; }
	        /// <summary>
	        /// int,该列所属的表对象 ID,或与该参数关联的存储过程 ID。 
	        /// </summary>
	        [ColumnName("id")]
	        public int Id { get; set; }
	        /// <summary>
	        /// tinyint,systypes 中的物理存储类型。 
	        /// </summary>
	        [ColumnName("xtype")]
	        public byte XType { get; set; }
	        /// <summary>
	        /// smallint,扩展的用户定义数据类型 ID。 
	        /// </summary>
	        [ColumnName("xusertype")]
	        public short XUserType { get; set; }
	        /// <summary>
	        /// smallint,systypes 中的最大物理存储长度。 
	        /// </summary>
	        [ColumnName("length")]
	        public short Length { get; set; }
	        /// <summary>
	        /// smallint,列或参数 ID。 
	        /// </summary>
	        [ColumnName("colid")]
	        public short ColumnId { get; set; }
	        /// <summary>
	        /// int,该列的默认值 ID。 
	        /// </summary>
	        [ColumnName("cdefault")]
	        public int CDefault { get; set; }
	        /// <summary>
	        /// int,该列的规则或 CHECK 约束 ID。 
	        /// </summary>
	        [ColumnName("domain")]
	        public int Domain { get; set; }
	        /// <summary>
	        /// smallint,过程分组时(0 表示非过程项)的子过程号。 
	        /// </summary>
	        [ColumnName("number")]
	        public short Number { get; set; }
	        /// <summary>
	        /// smallint,该列所在行的偏移量;如果为负,表示可变长度行。 
	        /// </summary>
	        [ColumnName("offset")]
	        public short Offset { get; set; }
	        /// <summary>
	        /// tinyint  用于描述列或参数属性的位图: 
	        ///0x08 = 列允许空值。
	        ///0x10 = 当添加 varchar 或 varbinary 列时,ANSI 填充生效。保留 varchar 列的尾随空格,保留 varbinary 列的尾随零。
	        ///0x40 = 参数为 OUTPUT 参数。
	        ///0x80 = 列为标识列。
	        /// </summary>
	        [ColumnName("status")]
	        public byte Status { get; set; }
	        /// <summary>
	        /// tinyint,systypes 中的物理存储类型。 
	        /// </summary>
	        [ColumnName("type")]
	        public byte Type { get; set; }
	        /// <summary>
	        /// smallint,systypes 中的用户定义数据类型 ID。 
	        /// </summary>
	        [ColumnName("usertype")]
	        public short UserType { get; set; }
	        /// <summary>
	        /// smallint,该列的精度级别。 
	        /// </summary>
	        [ColumnName("prec")]
	        public short? Prec { get; set; }
	        /// <summary>
	        /// int,该列的小数位数。 
	        /// </summary>
	        [ColumnName("scale")]
	        public int? Scale { get; set; }
	        /// <summary>
	        /// int  表示是否已计算该列的标志: 0 = 未计算。1 = 已计算。
	        /// </summary>
	        [ColumnName("iscomputed")]
	        public int IsComputed { get; set; }
	        /// <summary>
	        /// int  表示该过程参数是否是输出参数: 1 = 真。0 = 假。
	        /// </summary>
	        [ColumnName("isoutparam")]
	        public int IsOutParameter { get; set; }
	        /// <summary>
	        /// int  表示该列是否允许空值: 1 = 真。0 = 假。
	        /// </summary>
	        [ColumnName("isnullable")]
	        public int IsNullable { get; set; }
	    }
	
	    /// <summary>
	    /// 该表只存储在 master 数据库中。
	    /// Microsoft SQL Server 上的每个数据库在表中占一行。
	    /// 最初安装 SQL Server 时, sysdatabases 包含 master 、 model 、 msdb 、 mssqlweb 和 tempdb 数据库的项。
	    /// 作者:周公(zhoufoxcn,转载请注明出处)
	    /// 创建日期:2011-12-21
	    /// 博客地址:http://blog.csdn.net/zhoufoxcn 或 http://zhoufoxcn.blog.51cto.com
	    /// 新浪微博地址:http://weibo.com/zhoufoxcn
	    /// </summary>
	    public sealed class SysDatabase
	    {
	        /// <summary>
	        /// sysname,数据库的名称。
	        /// </summary>
	        [ColumnName("name")]
	        public string Name { get; set; }
	        /// <summary>
	        /// smallint,数据库 ID。
	        /// </summary>
	        [ColumnName("dbid")]
	        public short DbId { get; set; }
	        /// <summary>
	        /// varbinary(85),数据库创建者的系统 ID。
	        /// </summary>
	        [ColumnName("sid")]
	        public string Sid { get; set; }
	        /// <summary>
	        /// smallint,用于创建数据库时在内部锁定该数据库。
	        /// </summary>
	        [ColumnName("mode")]
	        public short Mode { get; set; }
	        /// <summary>
	        /// int,状态位,其中某些状态位可由用户使用 sp_dboption ( read only 、 dbo use only 、 single user 等)进行设置:
	        ///1 = autoclose ;使用 sp_dboption 设置。
	        ///4 = select into/bulkcopy ;使用 sp_dboption 设置。
	        ///8 = trunc. log on chkpt ;使用 sp_dboption 设置。
	        ///16 = torn page detection ,使用 sp_dboption 设置。
	        ///32 = loading 。
	        ///64 = pre recovery 。
	        ///128 = recovering 。
	        ///256 = not recovered 。
	        ///512 = offline ;使用 sp_dboption 设置。
	        ///1024 = read only ;使用 sp_dboption 设置。
	        ///2048 = dbo use only ;使用sp_dboption 设置。
	        ///4096 = single user ;使用 sp_dboption 设置。
	        ///32768 = emergency mode 。 
	        ///4194304 = autoshrink 。 
	        ///1073741824 = cleanly shutdown 。
	        ///可以同时打开多个位。
	        /// </summary>
	        [ColumnName("status")]
	        public int Status { get; set; }
	        /// <summary>
	        /// int,16384 = ANSI null default ;使用 sp_dboption 设置。
	        /// 65536 = concat null yields null ,使用 sp_dboption 设置。
	        /// 131072 = recursive triggers ,使用 sp_dboption 设置。
	        /// 1048576 = default to local cursor ,使用 sp_dboption 设置。
	        /// 8388608 = quoted identifier ,使用sp_dboption 设置。
	        /// 33554432 = cursor close on commit ,使用 sp_dboption 设置。
	        /// 67108864 = ANSI nulls ,使用 sp_dboption 设置。
	        /// 268435456 = ANSI warnings ,使用 sp_dboption 设置。
	        /// 536870912 = full text enabled ,使用 sp_fulltext_database 设置。
	        /// </summary>
	        [ColumnName("status2")]
	        public int Status2 { get; set; }
	        /// <summary>
	        /// datetime,创建日期。
	        /// </summary>
	        [ColumnName("crdate")]
	        public DateTime CreateDate { get; set; }
	        /// <summary>
	        /// int,包含用于复制的信息位图:1 = 已发布。2 = 已订阅。4 = 合并已发布。8 = 合并已订阅。
	        /// </summary>
	        [ColumnName("category")]
	        public int Category { get; set; }
	        /// <summary>
	        /// tinyint,数据库的兼容级别。
	        /// </summary>
	        [ColumnName("cmptlevel")]
	        public byte CmptLevel { get; set; }
	        /// <summary>
	        /// nvarchar(260),数据库主文件的操作系统路径和名称。
	        /// </summary>
	        [ColumnName("filename")]
	        public string FileName { get; set; }
	        /// <summary>
	        /// smallint,创建数据库时使用的 SQL Server 代码内部版本号。仅供 SQL Server 工具在内部用于升级处理。
	        /// </summary>
	        [ColumnName("version")]
	        public short Version { get; set; }
	
	    }
	
	    /// <summary>
	    /// 数据库中的每个文件在表中占一行。
	    /// 该系统表是虚拟表,不能直接更新或修改。
	    /// 作者:周公(zhoufoxcn,转载请注明出处)
	    /// 创建日期:2011-12-21
	    /// 博客地址:http://blog.csdn.net/zhoufoxcn 或 http://zhoufoxcn.blog.51cto.com
	    /// 新浪微博地址:http://weibo.com/zhoufoxcn 
	    /// </summary>
	    public sealed class SysFile
	    {
	        /// <summary>
	        /// smallint,每个数据库的唯一文件标识号。 
	        /// </summary>
	        [ColumnName("fileid")]
	        public short FileId { get; set; }
	        /// <summary>
	        /// smallint,文件组标识号。 
	        /// </summary>
	        [ColumnName("groupid")]
	        public short GroupId { get; set; }
	        /// <summary>
	        /// int,文件大小(以 8 KB 页为单位)。 
	        /// </summary>
	        [ColumnName("size")]
	        public int Size { get; set; }
	        /// <summary>
	        /// int,最大文件大小(以 8 KB 页为单位)。0 值表示不增长,–1 值表示文件应一直增长到磁盘已满。 
	        /// </summary>
	        [ColumnName("maxsize")]
	        public int MaxSize { get; set; }
	        /// <summary>
	        /// int,数据库的增长大小。0 值表示不增长。根据状态的值,可以是页数或文件大小的百分比。如果 status 包含 0x100000,则 growth 是文件大小的百分比;否则,它是页数。 
	        /// </summary>
	        [ColumnName("growth")]
	        public int Growth { get; set; }
	        /// <summary>
	        /// int,growth 值(以兆字节 (MB) 或千字节 (KB) 为单位)的状态位。 
	        ///0x1 = 默认设备。
	        ///0x2 = 磁盘文件。
	        ///0x40 = 日志设备。
	        ///0x80 = 自上次备份后已写入文件。
	        ///0x4000 = 由 CREATE DATABASE 语句
	        ///隐性创建的设备。
	        ///0x8000 = 在数据库创建过程中创建的设备。
	        ///0x100000 = 按百分比而不是按页数增长。
	        /// </summary>
	        [ColumnName("status")]
	        public int Status { get; set; }
	        /// <summary>
	        /// nchar(128),文件的逻辑名称。 
	        /// </summary>
	        [ColumnName("name")]
	        public string Name { get; set; }
	        /// <summary>
	        /// nchar(260),物理设备的名称,包括文件的完整路径。 
	        /// </summary>
	        [ColumnName("filename")]
	        public string FileName { get; set; }
	    }
	
	    /// <summary>
	    /// 该表只存储在 master 数据库中。
	    /// 每个登录帐户在表中占一行。
	    /// 作者:周公(zhoufoxcn,转载请注明出处)
	    /// 创建日期:2011-12-21
	    /// 博客地址:http://blog.csdn.net/zhoufoxcn 或 http://zhoufoxcn.blog.51cto.com
	    /// 新浪微博地址:http://weibo.com/zhoufoxcn
	    /// </summary>
	    public sealed class SysLogin
	    {
	        /// <summary>
	        /// varbinary(85),安全标识符。
	        /// </summary>
	        [ColumnName("sid")]
	        public string Sid { get; set; }
	        /// <summary>
	        /// datetime,添加登录的日期。
	        /// </summary>
	        [ColumnName("createdate")]
	        public DateTime CreateDate { get; set; }
	        /// <summary>
	        /// datetime,更新登录的日期。
	        /// </summary>
	        [ColumnName("updatedate")]
	        public DateTime UpdateDate { get; set; }
	        /// <summary>
	        /// varchar(30),用户的登录 ID。
	        /// </summary>
	        [ColumnName("name")]
	        public string Name { get; set; }
	        /// <summary>
	        /// nvarchar(128),建立连接时,用户的默认数据库名。
	        /// </summary>
	        [ColumnName("dbname")]
	        public string DbName { get; set; }
	        /// <summary>
	        /// nvarchar(128),用户的加密密码(可以是 NULL)。
	        /// </summary>
	        [ColumnName("password")]
	        public string Password { get; set; }
	        /// <summary>
	        /// nvarchar(128),用户的默认语言。
	        /// </summary>
	        [ColumnName("language")]
	        public string Language { get; set; }
	        /// <summary>
	        /// int,如果登录是 Microsoft Windows NT 用户或组且已被拒绝访问,则为 1。
	        /// </summary>
	        [ColumnName("denylogin")]
	        public int DenyLogin { get; set; }
	        /// <summary>
	        /// int,如果已授权登录访问服务器,则为 1。
	        /// </summary>
	        [ColumnName("hasaccess")]
	        public int HasAccess { get; set; }
	        /// <summary>
	        /// int,如果登录是 Windows NT 用户或组,则为 1;如果登录是 Microsoft SQL Server 登录,则为 0。
	        /// </summary>
	        [ColumnName("isntname")]
	        public int IsNTName { get; set; }
	        /// <summary>
	        /// int,如果登录是 Windows NT 组,则为 1。
	        /// </summary>
	        [ColumnName("isntgroup")]
	        public int IsNTGroup { get; set; }
	        /// <summary>
	        /// int,如果登录是 Windows NT 用户,则为 1。
	        /// </summary>
	        [ColumnName("isntuser")]
	        public int IsNTUser { get; set; }
	        /// <summary>
	        /// int,如果登录是 sysadmin 服务器角色成员,则为 1。
	        /// </summary>
	        [ColumnName("sysadmin")]
	        public int SystemAdmin { get; set; }
	        /// <summary>
	        /// int,如果登录是 securityadmin 服务器角色成员,则为 1。
	        /// </summary>
	        [ColumnName("securityadmin")]
	        public int SecurityAdmin { get; set; }
	        /// <summary>
	        /// int,如果登录是 serveradmin 固定服务器角色成员,则为 1。
	        /// </summary>
	        [ColumnName("serveradmin")]
	        public int ServerAdmin { get; set; }
	        /// <summary>
	        /// int,如果登录是 setupadmin 固定服务器角色成员,则为 1。
	        /// </summary>
	        [ColumnName("setupadmin")]
	        public int SetupAdmin { get; set; }
	        /// <summary>
	        /// int,如果登录是 processadmin 固定服务器角色成员,则为 1。
	        /// </summary>
	        [ColumnName("processadmin")]
	        public int ProccessAdmin { get; set; }
	        /// <summary>
	        /// int,如果登录是 diskadmin 固定服务器角色成员,则为 1。
	        /// </summary>
	        [ColumnName("diskadmin")]
	        public int DiskAdmin { get; set; }
	        /// <summary>
	        /// int,如果登录是 dbcreator 固定服务器角色成员,则为 1。
	        /// </summary>
	        [ColumnName("dbcreator")]
	        public int DbCreator { get; set; }
	        /// <summary>
	        /// nvarchar(128),登录的实际名称,该名称可能不同于 SQL Server 所使用的登录名。
	        /// </summary>
	        [ColumnName("loginname")]
	        public string LoginName { get; set; }
	    }
	
	    /// <summary>
	    /// 在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行。
	    /// 只有在 tempdb 内,每个临时对象才在该表中占一行。
	    /// 作者:周公(zhoufoxcn,转载请注明出处)
	    /// 创建日期:2011-12-21
	    /// 博客地址:http://blog.csdn.net/zhoufoxcn 或 http://zhoufoxcn.blog.51cto.com
	    /// 新浪微博地址:http://weibo.com/zhoufoxcn
	    /// </summary>
	    public sealed class SysObject
	    {
	        /// <summary>
	        /// sysname,对象名。 
	        /// </summary>
	        [ColumnName("name")]
	        public string Name { get; set; }
	        /// <summary>
	        /// int,对象标识号。 
	        /// </summary>
	        [ColumnName("Id")]
	        public int Id { get; set; }
	        /// <summary>
	        /// char(2)  对象类型。可以是下列对象类型中的一种: 
	        /// C = CHECK 约束
	        /// D = 默认值或 DEFAULT 约束
	        /// F = FOREIGN KEY 约束
	        /// L = 日志
	        /// FN = 标量函数
	        /// IF = 内嵌表函数
	        /// P = 存储过程
	        /// PK = PRIMARY KEY 约束(类型是 K)
	        /// RF = 复制筛选存储过程
	        /// S = 系统表
	        /// TF = 表函数
	        /// TR = 触发器
	        /// U = 用户表
	        /// UQ = UNIQUE 约束(类型是 K)
	        /// V = 视图
	        /// X = 扩展存储过程
	        /// </summary>
	        [ColumnName("xtype")]
	        public string XType { get; set; }
	        /// <summary>
	        /// smallint,所有者对象的用户 ID。 
	        /// </summary>
	        [ColumnName("uid")]
	        public short Uid { get; set; }
	        /// <summary>
	        /// int,父对象的对象标识号(例如,对于触发器或约束,该标识号为表 ID)。 
	        /// </summary>
	        [ColumnName("parent_obj")]
	        public int Parent_Object { get; set; }
	        /// <summary>
	        /// datetime,对象的创建日期。 
	        /// </summary>
	        [ColumnName("crdate")]
	        public DateTime CreateDate { get; set; }
	        /// <summary>
	        /// smallint,为全文索引注册的所有用户表的全文目录标识符,对于没有注册的所有用户表则为 0。 
	        /// </summary>
	        [ColumnName("ftcatid")]
	        public short FtCatId { get; set; }
	        /// <summary>
	        /// int,版本号,该版本号在每次表的架构更改时都增加。 
	        /// </summary>
	        [ColumnName("schema_ver")]
	        public int Schemal_Version { get; set; }
	        /// <summary>
	        /// char(2)  对象类型。可以是下列对象类型中的一种: 
	        /// C = CHECK 约束
	        /// D = 默认值或 DEFAULT 约束
	        /// F = FOREIGN KEY 约束
	        /// L = 日志
	        /// FN = 标量函数
	        /// IF = 内嵌表函数
	        /// P = 存储过程
	        /// PK = PRIMARY KEY 约束(类型是 K)
	        /// RF = 复制筛选存储过程
	        /// S = 系统表
	        /// TF = 表函数
	        /// TR = 触发器
	        /// U = 用户表
	        /// UQ = UNIQUE 约束(类型是 K)
	        /// V = 视图
	        /// X = 扩展存储过程
	        /// </summary>
	        [ColumnName("type")]
	        public string Type { get; set; }
	        /// <summary>
	        /// smallint,内部状态信息。 
	        /// </summary>
	        [ColumnName("sysstat")]
	        public short SysStat { get; set; }
	        /// <summary>
	        /// int,用于发布、约束和标识。 
	        /// </summary>
	        [ColumnName("category")]
	        public int Category { get; set; }
	    }
	
	    /// <summary>
	    /// 对于每种系统提供数据类型和用户定义数据类型,均包含一行信息。
	    /// 该表存储在每个数据库中。
	    ///这些是系统提供的数据类型及其 ID 号。
	    /// 作者:周公(zhoufoxcn,转载请注明出处)
	    /// 创建日期:2011-12-21
	    /// 博客地址:http://blog.csdn.net/zhoufoxcn 或 http://zhoufoxcn.blog.51cto.com
	    /// 新浪微博地址:http://weibo.com/zhoufoxcn
	    /// </summary>
	    public sealed class SysType
	    {
	        /// <summary>
	        /// sysname,数据类型名称。 
	        /// </summary>
	        [ColumnName("name")]
	        public string Name { get; set; }
	        /// <summary>
	        /// tinyint,物理存储类型。 
	        /// </summary>
	        [ColumnName("xtype")]
	        public byte XType { get; set; }
	        /// <summary>
	        /// smallint,扩展用户类型。 
	        /// </summary>
	        [ColumnName("xusertype")]
	        public short XUserType { get; set; }
	        /// <summary>
	        /// smallint,数据类型的物理长度。 
	        /// </summary>
	        [ColumnName("length")]
	        public short Length { get; set; }
	        /// <summary>
	        /// tinyint,服务器所使用的内部精度。(不能在查询中使用。) 
	        /// </summary>
	        [ColumnName("xprec")]
	        public byte XPrec { get; set; }
	        /// <summary>
	        /// tinyint,服务器所使用的内部小数位数。(不能在查询中使用。) 
	        /// </summary>
	        [ColumnName("xscale")]
	        public byte XScale { get; set; }
	        /// <summary>
	        /// int,对此数据类型进行完整性检查的存储过程的 ID。 
	        /// </summary>
	        [ColumnName("tdefault")]
	        public int TDefault { get; set; }
	        /// <summary>
	        /// int,对此数据类型进行完整性检查的存储过程的 ID。 
	        /// </summary>
	        [ColumnName("domain")]
	        public int Domain { get; set; }
	        /// <summary>
	        /// smallint,数据类型创建者的用户 ID。 
	        /// </summary>
	        [ColumnName("uid")]
	        public short Uid { get; set; }
	        /// <summary>
	        /// smallint,用户类型 ID。 
	        /// </summary>
	        [ColumnName("usertype")]
	        public short UserType { get; set; }
	        /// <summary>
	        /// bit,可变长度数据类型为 1;否则为 0。 
	        /// </summary>
	        [ColumnName("variable")]
	        public bool Variable { get; set; }
	        /// <summary>
	        /// bit,指出此数据类型的默认为空性。如果 CREATE 或 ALTER TABLE 指定了为空性,那么该值将替代此数据类型的默认为空性。 
	        /// </summary>
	        [ColumnName("allownulls")]
	        public bool AllowNulls { get; set; }
	        /// <summary>
	        /// tinyint,物理存储数据类型。 
	        /// </summary>
	        [ColumnName("type")]
	        public short Type { get; set; }
	        /// <summary>
	        /// smallint,此数据类型的精度级别。 
	        /// </summary>
	        [ColumnName("prec")]
	        public short? Prec { get; set; }
	        /// <summary>
	        /// tinyint,此数据类型的小数位数(根据精度)。 
	        /// </summary>
	        [ColumnName("scale")]
	        public byte? Scale { get; set; }
	    }
	
	    /// <summary>
	    /// 数据库中每个 Microsoft Windows 用户、Windows 组、Microsoft SQL Server 用户或 SQL Server 角色在表中占一行。
	    /// 作者:周公(zhoufoxcn,转载请注明出处)
	    /// 创建日期:2011-12-21
	    /// 博客地址:http://blog.csdn.net/zhoufoxcn 或 http://zhoufoxcn.blog.51cto.com
	    /// 新浪微博地址:http://weibo.com/zhoufoxcn
	    /// </summary>
	    public sealed class SysUser
	    {
	        /// <summary>
	        /// smallint,用户 ID,在此数据库中是唯一的。1 是数据库所有者。 
	        /// </summary>
	        [ColumnName("uid")]
	        public short Uid { get; set; }
	        /// <summary>
	        /// sysname,用户名或组名,在此数据库中是唯一的。 
	        /// </summary>
	        [ColumnName("Name")]
	        public string Name { get; set; }
	        /// <summary>
	        /// varbinary(85),此条目的安全性标识符。 
	        /// </summary>
	        [ColumnName("sid")]
	        public byte[] Sid { get; set; }
	        /// <summary>
	        /// datetime,帐户的添加日期。 
	        /// </summary>
	        [ColumnName("createdate")]
	        public DateTime CreateDate { get; set; }
	        /// <summary>
	        /// datetime,帐户的上次修改日期。 
	        /// </summary>
	        [ColumnName("updatedate")]
	        public DateTime UpdateDate { get; set; }
	        /// <summary>
	        /// smallint,此用户所属的组 ID。如果 uid = gid ,那么此条目就定义一个组。 
	        /// </summary>
	        [ColumnName("gid")]
	        public short Gid { get; set; }
	        /// <summary>
	        /// int,如果该帐户有数据库访问权限,则为 1。 
	        /// </summary>
	        [ColumnName("hasdbaccess")]
	        public int HasDbAccess { get; set; }
	        /// <summary>
	        /// int,如果该帐户是有登录帐户的 Windows 组、Windows 用户或 SQL Server 用户,则为 1。 
	        /// </summary>
	        [ColumnName("islogin")]
	        public int IsLogin { get; set; }
	        /// <summary>
	        /// int,如果该帐户是 Windows 组或 Windows 用户,则为 1。 
	        /// </summary>
	        [ColumnName("isntname")]
	        public int IsNtName { get; set; }
	        /// <summary>
	        /// int,如果该帐户是 Windows 组,则为 1。 
	        /// </summary>
	        [ColumnName("isntgroup")]
	        public int IsNtGroup { get; set; }
	        /// <summary>
	        /// int,如果该帐户是 Windows 用户,则为 1。 
	        /// </summary>
	        [ColumnName("isntuser")]
	        public int IsNtUser { get; set; }
	        /// <summary>
	        /// int,如果该帐户是 SQL Server 用户,则为 1。 
	        /// </summary>
	        [ColumnName("issqluser")]
	        public int IsSqlUser { get; set; }
	        /// <summary>
	        /// int,如果该帐户以另一个用户为别名,则为 1。 
	        /// </summary>
	        [ColumnName("isaliased")]
	        public int IsAliased { get; set; }
	        /// <summary>
	        /// int,如果该帐户是 SQL Server 角色,则为 1。 
	        /// </summary>
	        [ColumnName("issqlrole")]
	        public int IsSqlRole { get; set; }
	        /// <summary>
	        /// int,如果该帐户是应用程序角色,则为 1。 
	        /// </summary>
	        [ColumnName("isapprole")]
	        public int IsAppRole { get; set; }
	    }
	
	    /// <summary>
	    /// 代表SQL Server 2000 或 SQL Server 2005 实例的信息的类.
	    /// 由 SqlDataSourceEnumerator 定位网络上的数据源所使用的机制的性质决定,该方法并不总是能返回可用服务器的完整列表,该列表可能在每次调用时都不同。
	    /// 如果您打算使用此函数来让用户从列表中选择服务器,请确保您始终同时提供键入列表中所没有的名称的选项,以防服务器枚举未能返回所有的可用服务器。
	    /// 此外,此方法的执行时间可能相当长,因此如果性能要求很高,在调用此方法时应谨慎从事。
	    /// 作者:周公(zhoufoxcn,转载请注明出处)
	    /// 创建日期:2011-12-21
	    /// 博客地址:http://blog.csdn.net/zhoufoxcn 或 http://zhoufoxcn.blog.51cto.com
	    /// 新浪微博地址:http://weibo.com/zhoufoxcn
	    /// </summary>
	    public sealed class SqlServerDataSource
	    {
	        /// <summary>
	        /// 服务器名。
	        /// </summary>
	        public string ServerName { get; set; }
	        /// <summary>
	        /// 服务器实例的名称。如果服务器作为默认实例运行,则为空。
	        /// </summary>
	        public string InstanceName { get; set; }
	        /// <summary>
	        /// 指示服务器是否是群集的一部分。
	        /// </summary>
	        public bool IsClustered { get; set; }
	        /// <summary>
	        /// 服务器版本(对于 SQL Server 2000,为 8.00.x;对于 SQL Server 2005,为 9.00.x)。
	        /// </summary>
	        public string Version { get; set; }
	    }
	}

对外提供访问接口的类代码如下(注意代码中DbUtility类是来自于《C#打造自己的通用数据访问类库()》中的类,在周公处它们位于同一namespace下):

	using System;
	using System.Collections.Generic;
	using System.Text;
	using System.Data;
	using System.Data.Sql;
	using Microsoft.Win32;
	
	namespace NetSkycn.Data
	{
	    /// <summary>
	    /// 对外提供数据库管理信息的类
	    /// 作者:周公(zhoufoxcn,转载请注明出处)
	    /// 创建日期:2011-12-21
	    /// 博客地址:http://blog.csdn.net/zhoufoxcn 或 http://zhoufoxcn.blog.51cto.com
	    /// 新浪微博地址:http://weibo.com/zhoufoxcn
	    /// </summary>
	    public class SqlServerManager
	    {
	        private static readonly string SQL_GetSysAltFiles = "use master;select * from SysAltFiles";
	        private static readonly string SQL_GetSysColumns = "select * from SysColumns";
	        private static readonly string SQL_GetSysDatabases = "use master;select * from SysDatabases";
	        private static readonly string SQL_GetSysFiles = "select * from SysFiles";
	        private static readonly string SQL_GetSysLogins = "use master;select * from SysLogins";
	        private static readonly string SQL_GetSysObjects = "select * from SysObjects";
	        private static readonly string SQL_GetSysTypes = "select * from SysTypes";
	        private static readonly string SQL_GetSysUsers = "select * from SysUsers";
	
	        private DbUtility dbUtility = null;
	        public string ConnectionString { get; set; }
	        public SqlServerManager()
	        {
	
	        }
	        /// <summary>
	        /// 创建SqlServerManager的实例
	        /// </summary>
	        /// <param name="connectionString"></param>
	        public SqlServerManager(string connectionString)
	        {
	            this.ConnectionString = connectionString;
	            dbUtility = new DbUtility(connectionString, DbProviderType.SqlServer);
	        }
	        /// <summary>
	        /// 从主数据库中保存数据库的文件信息
	        /// </summary>
	        /// <returns></returns>
	        public List<SysAltFile> GetSysAltFiles()
	        {
	            dbUtility.ConnectionString = ConnectionString;
	            return dbUtility.QueryForList<SysAltFile>(SQL_GetSysAltFiles, null);
	        }
	        /// <summary>
	        /// 从当前连接的数据库中获取所有列的信息
	        /// </summary>
	        /// <returns></returns>
	        public List<SysColumn> GetSysColumns()
	        {
	            dbUtility.ConnectionString = ConnectionString;
	            return dbUtility.QueryForList<SysColumn>(SQL_GetSysColumns, null);
	        }
	        /// <summary>
	        /// 从主数据库中获取服务器中所有数据库的信息
	        /// </summary>
	        /// <returns></returns>
	        public List<SysDatabase> GetSysDatabases()
	        {
	            dbUtility.ConnectionString = ConnectionString;
	            return dbUtility.QueryForList<SysDatabase>(SQL_GetSysDatabases, null);
	        }
	        /// <summary>
	        /// 获取当前连接的数据库的数据库物理文件信息
	        /// </summary>
	        /// <returns></returns>
	        public List<SysFile> GetSysFiles()
	        {
	            dbUtility.ConnectionString = ConnectionString;
	            return dbUtility.QueryForList<SysFile>(SQL_GetSysFiles, null);
	        }
	        /// <summary>
	        /// 从主数据库中查询登陆帐号信息
	        /// </summary>
	        /// <returns></returns>
	        public List<SysLogin> GetSysLogins()
	        {
	            dbUtility.ConnectionString = ConnectionString;
	            return dbUtility.QueryForList<SysLogin>(SQL_GetSysLogins, null);
	        }
	        /// <summary>
	        /// 获取当前连接的数据库中所有数据库对象
	        /// </summary>
	        /// <returns></returns>
	        public List<SysObject> GetSysObjects()
	        {
	            dbUtility.ConnectionString = ConnectionString;
	            return dbUtility.QueryForList<SysObject>(SQL_GetSysObjects, null);
	        }
	        /// <summary>
	        /// 获取当前连接的数据库中用户定义数据类型
	        /// </summary>
	        /// <returns></returns>
	        public List<SysType> GetSysTypes()
	        {
	            dbUtility.ConnectionString = ConnectionString;
	            return dbUtility.QueryForList<SysType>(SQL_GetSysTypes, null);
	        }
	        /// <summary>
	        /// 获取当前连接的数据中的用户信息
	        /// </summary>
	        /// <returns></returns>
	        public List<SysUser> GetSysUsers()
	        {
	            dbUtility.ConnectionString = ConnectionString;
	            return dbUtility.QueryForList<SysUser>(SQL_GetSysUsers, null);
	        }
	        /// <summary>
	        /// 
	        /// </summary>
	        /// <param name="connectionString"></param>
	        /// <returns></returns>
	        public static List<SysAltFile> GetSysAltFiles(string connectionString)
	        {
	            DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
	            return utility.QueryForList<SysAltFile>(SQL_GetSysAltFiles, null);
	        }
	        /// <summary>
	        /// 
	        /// </summary>
	        /// <param name="connectionString"></param>
	        /// <returns></returns>
	        public static List<SysColumn> GetColumns(string connectionString)
	        {
	            DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
	            return utility.QueryForList<SysColumn>(SQL_GetSysColumns, null);
	        }
	        /// <summary>
	        /// 
	        /// </summary>
	        /// <param name="connectionString"></param>
	        /// <returns></returns>
	        public static List<SysDatabase> GetSysDatabases(string connectionString)
	        {
	            DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
	            return utility.QueryForList<SysDatabase>(SQL_GetSysDatabases, null);
	        }
	        /// <summary>
	        /// 
	        /// </summary>
	        /// <param name="connectionString"></param>
	        /// <returns></returns>
	        public static List<SysFile> GetSysFiles(string connectionString)
	        {
	            DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
	            return utility.QueryForList<SysFile>(SQL_GetSysFiles, null);
	        }
	        /// <summary>
	        /// 
	        /// </summary>
	        /// <param name="connectionString"></param>
	        /// <returns></returns>
	        public static List<SysLogin> GetSysLogins(string connectionString)
	        {
	            DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
	            return utility.QueryForList<SysLogin>(SQL_GetSysLogins, null);
	        }
	        /// <summary>
	        /// 
	        /// </summary>
	        /// <param name="connectionString"></param>
	        /// <returns></returns>
	        public static List<SysObject> GetSysObjects(string connectionString)
	        {
	            DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
	            return utility.QueryForList<SysObject>(SQL_GetSysObjects, null);
	        }
	        /// <summary>
	        /// 
	        /// </summary>
	        /// <param name="connectionString"></param>
	        /// <returns></returns>
	        public static List<SysType> GetSysTypes(string connectionString)
	        {
	            DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
	            return utility.QueryForList<SysType>(SQL_GetSysTypes, null);
	        }
	        /// <summary>
	        /// 
	        /// </summary>
	        /// <param name="connectionString"></param>
	        /// <returns></returns>
	        public static List<SysUser> GetSysUsers(string connectionString)
	        {
	            DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
	            return utility.QueryForList<SysUser>(SQL_GetSysUsers, null);
	        }
	        
	        /// <summary>
	        /// 检索局域网内(但不包括本机)包含有关所有可见 SQL Server 2000 或 SQL Server 2005 实例的信息的
	        /// </summary>
	        /// <returns></returns>
	        public static List<SqlServerDataSource> GetDataSources()
	        {
	            DataTable data = SqlDataSourceEnumerator.Instance.GetDataSources();
	            foreach (DataColumn column in data.Columns)
	            {
	                Console.WriteLine(column.ColumnName);
	            }
	            return EntityReader.GetEntities<SqlServerDataSource>(data);
	        }
	        /// <summary>
	        /// 获取本地及当前局域网内所有的SQL Server数据库服务器实例的名称
	        /// </summary>
	        /// <returns></returns>
	        public static List<string> EnumerateAllDbInstance()
	        {
	            List<string> allInstances = EnumerateLocalDbInstance();
	            allInstances.AddRange(EnumerateRemoteDbInstance());
	            return allInstances;
	        }
	        /// <summary>
	        ///查询本机的SQL Server服务器实例
	        /// </summary>
	        /// <returns></returns>
	        public static List<string> EnumerateLocalDbInstance()
	        {
	            List<string> serverInstances = new List<string>();
	            RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server");
	            string[] keyValue = (string[])registryKey.GetValue("InstalledInstances");
	            if (keyValue != null && (int)keyValue.Length > 0)
	            {
	                string[] strArrays = keyValue;
	                foreach (string instanceName in strArrays)
	                {
	                    //采用默认实例名的数据库服务器,其默认实例名就是电脑名
	                    if (string.Compare(instanceName, "MSSQLSERVER", StringComparison.InvariantCultureIgnoreCase) == 0)
	                    {
	                        serverInstances.Add(Environment.MachineName);
	                    }
	                    else//采用电脑名+实例名的数据库服务器(通常见于一台Server上安装了多个SQL Server)
	                    {
	                        serverInstances.Add(string.Format("{0}\\{1}", Environment.MachineName, instanceName));
	                    }
	                }
	            }
	            return serverInstances;
	        }
	
	        /// <summary>
	        ///查询当前局域网中正在运行的SQL Server数据库服务器实例
	        /// </summary>
	        /// <returns></returns>
	        public static List<string> EnumerateRemoteDbInstance()
	        {
	            DataTable dataServer = SqlDataSourceEnumerator.Instance.GetDataSources();
	            List<string> listServer = new List<string>(dataServer.Rows.Count);
	            string serverName, instanceName;
	            foreach (DataRow row in dataServer.Rows)
	            {
	                serverName = row["ServerName"].ToString();
	                instanceName = row["InstanceName"].ToString();
	                if (!string.IsNullOrEmpty(instanceName))
	                {
	                    listServer.Add(string.Format("{0}\\{1}", serverName, instanceName));
	                }
	                else
	                {
	                    listServer.Add(serverName);
	                }
	
	            }
	            return listServer;
	
	        }
	    }
	}

单元测试代码如下(注意使用了NUnit作为单元测试工具)

	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;
	using NetSkycn.Data;
	using NUnit.Framework;
	
	namespace netskycnNUnitTest
	{
	    [TestFixture]
	    public class SqlServerManagerTest
	    {
	        private static string connectionString = "Data Source=testServer;Initial Catalog=testDB;User ID=sa;Password=test;";
	        private SqlServerManager manager = null;
	        public static void Main()
	        {
	            int i = SqlServerManager.GetDataSources().Count;
	            Console.WriteLine(typeof(int?));
	            Console.WriteLine(typeof(int?).GetGenericArguments()[0]);
	            Console.WriteLine(typeof(int?).BaseType);
	            Console.WriteLine(typeof(int?).BaseType.DeclaringType);
	            Console.WriteLine(typeof(int?).BaseType.BaseType);
	            Console.ReadLine();
	        }
	
	        [TestFixtureSetUp]
	        public void Initialize()
	        {
	            manager = new SqlServerManager(connectionString);
	        }
	
	        [Test]
	        public void InstanceGetSysAltFiles()
	        {
	            Assert.Greater(manager.GetSysAltFiles().Count, 0);
	        }
	        [Test]
	        public void InstanceGetSysColumns()
	        {
	            Assert.Greater(manager.GetSysColumns().Count, 0);
	        }
	        [Test]
	        public void InstanceGetSysDatabases()
	        {
	            Assert.Greater(manager.GetSysDatabases().Count, 0);
	        }
	        [Test]
	        public void InstanceGetSysFiles()
	        {
	            Assert.Greater(manager.GetSysFiles().Count, 0);
	        }
	        [Test]
	        public void InstanceGetSysLogins()
	        {
	            Assert.Greater(manager.GetSysLogins().Count, 0);
	        }
	        [Test]
	        public void InstanceGetSysObjects()
	        {
	            Assert.Greater(manager.GetSysObjects().Count, 0);
	        }
	        [Test]
	        public void InstanceGetSysTypes()
	        {
	            Assert.Greater(manager.GetSysTypes().Count, 0);
	        }
	        [Test]
	        public void InstanceGetSysUsers()
	        {
	            Assert.Greater(manager.GetSysUsers().Count, 0);
	        }
	        [Test]
	        public void StaticGetSysAltFiles()
	        {
	            Assert.Greater(SqlServerManager.GetSysAltFiles(connectionString).Count, 0);
	        }
	        [Test]
	        public void StaticGetColumns()
	        {
	            Assert.Greater(SqlServerManager.GetColumns(connectionString).Count, 0);
	        }
	        [Test]
	        public void StaticGetSysDatabases()
	        {
	            Assert.Greater(SqlServerManager.GetSysDatabases(connectionString).Count, 0);
	        }
	        [Test]
	        public void StaticGetSysFiles()
	        {
	            Assert.Greater(SqlServerManager.GetSysFiles(connectionString).Count, 0);
	        }
	        [Test]
	        public void StaticGetSysLogins()
	        {
	            Assert.Greater(SqlServerManager.GetSysLogins(connectionString).Count, 0);
	        }
	        [Test]
	        public void StaticGetSysObjects()
	        {
	            Assert.Greater(SqlServerManager.GetSysObjects(connectionString).Count, 0);
	        }
	        [Test]
	        public void StaticGetSysTypes()
	        {
	            Assert.Greater(SqlServerManager.GetSysTypes(connectionString).Count, 0);
	        }
	        [Test]
	        public void StaticGetSysUsers()
	        {
	            Assert.Greater(SqlServerManager.GetSysUsers(connectionString).Count, 0);
	        }
	    }
	}

单元测试结果:


证明测试通过。限于篇幅,其中某些方法可以提供更多参数的展开,但这不是本篇的重点。

周公

2012-04-19

武汉







分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics