最近在作一些數據庫管理維護方面的開發,須要瞭解一些有關數據庫的管理信息,好比本機上運行了哪些數據庫服務器實例,局域網內運行了哪些數據庫服務器實例及每一個數據庫服務器下有多少數據庫,每一個數據庫的物理文件大小及保存位置等等。結合了網上的一些資料和本人的屢次實踐,總結寫出本篇。在這裏要感謝一篇文章《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