首先是一些与系统表记录对应的实体类(注意代码中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
武汉