设为首页 收藏本站
查看: 1182|回复: 0

[经验分享] 在.NET中根据SQL Server系统表获取数据库管理信息

[复制链接]

尚未签到

发表于 2018-10-12 10:30:18 | 显示全部楼层 |阅读模式
  最近在做一些数据库管理维护方面的开发,需要了解一些有关数据库的管理信息,比如本机上运行了哪些数据库服务器实例,局域网内运行了哪些数据库服务器实例及每个数据库服务器下有多少数据库,每个数据库的物理文件大小及保存位置等等。结合了网上的一些资料和本人的多次实践,总结写出本篇。在这里要感谢一篇文章《sql server系统表详细说明》。
  首先是一些与系统表记录对应的实体类(注意代码中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
  • {
  •     ///
  •     /// 对外提供数据库管理信息的类
  •     /// 作者:周公(zhoufoxcn,转载请注明出处)
  •     /// 创建日期:2011-12-21
  •     /// 博客地址:http://blog.csdn.net/zhoufoxcn 或 http://zhoufoxcn.blog.51cto.com
  •     /// 新浪微博地址:http://weibo.com/zhoufoxcn
  •     ///
  •     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()
  •         {

  •         }
  •         ///
  •         /// 创建SqlServerManager的实例
  •         ///
  •         ///
  •         public SqlServerManager(string connectionString)
  •         {
  •             this.ConnectionString = connectionString;
  •             dbUtility = new DbUtility(connectionString, DbProviderType.SqlServer);
  •         }
  •         ///
  •         /// 从主数据库中保存数据库的文件信息
  •         ///
  •         ///
  •         public List GetSysAltFiles()
  •         {
  •             dbUtility.ConnectionString = ConnectionString;
  •             return dbUtility.QueryForList(SQL_GetSysAltFiles, null);
  •         }
  •         ///
  •         /// 从当前连接的数据库中获取所有列的信息
  •         ///
  •         ///
  •         public List GetSysColumns()
  •         {
  •             dbUtility.ConnectionString = ConnectionString;
  •             return dbUtility.QueryForList(SQL_GetSysColumns, null);
  •         }
  •         ///
  •         /// 从主数据库中获取服务器中所有数据库的信息
  •         ///
  •         ///
  •         public List GetSysDatabases()
  •         {
  •             dbUtility.ConnectionString = ConnectionString;
  •             return dbUtility.QueryForList(SQL_GetSysDatabases, null);
  •         }
  •         ///
  •         /// 获取当前连接的数据库的数据库物理文件信息
  •         ///
  •         ///
  •         public List GetSysFiles()
  •         {
  •             dbUtility.ConnectionString = ConnectionString;
  •             return dbUtility.QueryForList(SQL_GetSysFiles, null);
  •         }
  •         ///
  •         /// 从主数据库中查询登陆帐号信息
  •         ///
  •         ///
  •         public List GetSysLogins()
  •         {
  •             dbUtility.ConnectionString = ConnectionString;
  •             return dbUtility.QueryForList(SQL_GetSysLogins, null);
  •         }
  •         ///
  •         /// 获取当前连接的数据库中所有数据库对象
  •         ///
  •         ///
  •         public List GetSysObjects()
  •         {
  •             dbUtility.ConnectionString = ConnectionString;
  •             return dbUtility.QueryForList(SQL_GetSysObjects, null);
  •         }
  •         ///
  •         /// 获取当前连接的数据库中用户定义数据类型
  •         ///
  •         ///
  •         public List GetSysTypes()
  •         {
  •             dbUtility.ConnectionString = ConnectionString;
  •             return dbUtility.QueryForList(SQL_GetSysTypes, null);
  •         }
  •         ///
  •         /// 获取当前连接的数据中的用户信息
  •         ///
  •         ///
  •         public List GetSysUsers()
  •         {
  •             dbUtility.ConnectionString = ConnectionString;
  •             return dbUtility.QueryForList(SQL_GetSysUsers, null);
  •         }
  •         ///
  •         ///
  •         ///
  •         ///
  •         ///
  •         public static List GetSysAltFiles(string connectionString)
  •         {
  •             DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
  •             return utility.QueryForList(SQL_GetSysAltFiles, null);
  •         }
  •         ///
  •         ///
  •         ///
  •         ///
  •         ///
  •         public static List GetColumns(string connectionString)
  •         {
  •             DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
  •             return utility.QueryForList(SQL_GetSysColumns, null);
  •         }
  •         ///
  •         ///
  •         ///
  •         ///
  •         ///
  •         public static List GetSysDatabases(string connectionString)
  •         {
  •             DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
  •             return utility.QueryForList(SQL_GetSysDatabases, null);
  •         }
  •         ///
  •         ///
  •         ///
  •         ///
  •         ///
  •         public static List GetSysFiles(string connectionString)
  •         {
  •             DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
  •             return utility.QueryForList(SQL_GetSysFiles, null);
  •         }
  •         ///
  •         ///
  •         ///
  •         ///
  •         ///
  •         public static List GetSysLogins(string connectionString)
  •         {
  •             DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
  •             return utility.QueryForList(SQL_GetSysLogins, null);
  •         }
  •         ///
  •         ///
  •         ///
  •         ///
  •         ///
  •         public static List GetSysObjects(string connectionString)
  •         {
  •             DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
  •             return utility.QueryForList(SQL_GetSysObjects, null);
  •         }
  •         ///
  •         ///
  •         ///
  •         ///
  •         ///
  •         public static List GetSysTypes(string connectionString)
  •         {
  •             DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
  •             return utility.QueryForList(SQL_GetSysTypes, null);
  •         }
  •         ///
  •         ///
  •         ///
  •         ///
  •         ///
  •         public static List GetSysUsers(string connectionString)
  •         {
  •             DbUtility utility = new DbUtility(connectionString, DbProviderType.SqlServer);
  •             return utility.QueryForList(SQL_GetSysUsers, null);
  •         }

  •         ///
  •         /// 检索局域网内(但不包括本机)包含有关所有可见 SQL Server 2000 或 SQL Server 2005 实例的信息的
  •         ///
  •         ///
  •         public static List GetDataSources()
  •         {
  •             DataTable data = SqlDataSourceEnumerator.Instance.GetDataSources();
  •             foreach (DataColumn column in data.Columns)
  •             {
  •                 Console.WriteLine(column.ColumnName);
  •             }
  •             return EntityReader.GetEntities(data);
  •         }
  •         ///
  •         /// 获取本地及当前局域网内所有的SQL Server数据库服务器实例的名称
  •         ///
  •         ///
  •         public static List EnumerateAllDbInstance()
  •         {
  •             List allInstances = EnumerateLocalDbInstance();
  •             allInstances.AddRange(EnumerateRemoteDbInstance());
  •             return allInstances;
  •         }
  •         ///
  •         ///查询本机的SQL Server服务器实例
  •         ///
  •         ///
  •         public static List EnumerateLocalDbInstance()
  •         {
  •             List serverInstances = new List();
  •             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;
  •         }

  •         ///
  •         ///查询当前局域网中正在运行的SQL Server数据库服务器实例
  •         ///
  •         ///
  •         public static List EnumerateRemoteDbInstance()
  •         {
  •             DataTable dataServer = SqlDataSourceEnumerator.Instance.GetDataSources();
  •             List listServer = new List(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);
  •         }
  •     }
  • }
  

  单元测试结果:
DSC0000.jpg

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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-620668-1-1.html 上篇帖子: MS SQL Server 学习⑴ 下篇帖子: 关于JSP连接SQL Server 2000数据库的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表