最近在作一些数据库管理维护方面的开发,须要了解一些有关数据库的管理信息,好比本机上运行了哪些数据库服务器实例,局域网内运行了哪些数据库服务器实例及每一个数据库服务器下有多少数据库,每一个数据库的物理文件大小及保存位置等等。结合了网上的一些资料和本人的屡次实践,总结写出本篇。在这里要感谢一篇文章《sql server系统表详细说明》。sql
首先是一些与系统表记录对应的实体类(注意代码中ColumnNameAttribute类是来自于《用C#打造本身的通用数据访问类库(续)》中的类,在周公处它们位于同一namespace下):数据库
(因为51cto博客篇幅限制,所有代码在本文最后提供下载) 服务器
对外提供访问接口的类代码以下(注意代码中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做为单元测试工具,若是不会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
武汉 .net