封装SQLDMO操作的类
使用前请添加 "Microsoft SQLDMO Object Library" COM 引用。
有部分代码借鉴网络资料,再次向原作者表示感谢。
/* ********************************************** * Rainsoft Development Library for Microsoft.NET * Author: Q.yuhen (qyuhen@hotmail.com) ********************************************** */ using System; using System.Collections; using System.Runtime.InteropServices; using System.IO; using SQLDMO; namespace Rainsoft.Data { /// <summary> /// SQLDMO辅助类 /// </summary> /// <remarks> /// 使用前添加 "Microsoft SQLDMO Object Library" COM 引用。 /// </remarks> public class SqlDmoHelper { #region DatabaseInfo /// <summary> /// 数据库信息 /// </summary> public struct DatabaseInfo { public string Name; public string Owner; public string PrimaryFilePath; public string CreateDate; public int Size; public float SpaceAvailable; public string PrimaryName; public string PrimaryFilename; public int PrimarySize; public int PrimaryMaxSize; public string LogName; public string LogFilename; public int LogSize; public int LogMaxSize; public override string ToString() { string s = "Name:{0}\r\n" + "Owner:{1}\r\n" + "PrimaryFilePath:{2}\r\n" + "CreateDate:{3}\r\n" + "Size:{4}MB\r\n" + "SpaceAvailable:{5}MB\r\n" + "PrimaryName:{6}\r\n" + "PrimaryFilename:{7}\r\n" + "PrimarySize:{8}MB\r\n" + "PrimaryMaxSize:{9}MB\r\n" + "LogName:{10}\r\n" + "LogFilename:{11}\r\n" + "LogSize:{12}MB\r\n" + "LogMaxSize:{13}MB"; return string.Format(s, Name, Owner, PrimaryFilePath, CreateDate, Size, SpaceAvailable, PrimaryName, PrimaryFilename, PrimarySize, PrimaryMaxSize, LogName, LogFilename, LogSize, LogMaxSize); } } #endregion private SQLServer2 sqlServer; private string server; private string login; private string password; public SqlDmoHelper(string server, string login, string password) { this.server = server; this.login = login; this.password = password; sqlServer = new SQLServer2Class(); sqlServer.Connect(server, login, password); } public void Close() { sqlServer.Close(); } #region Property /// <summary> /// 获取主要版本号 /// </summary> public string Version { get { return string.Format("{0}.{1}", sqlServer.VersionMajor, sqlServer.VersionMinor); } } /// <summary> /// 获取详细版本信息 /// </summary> public string VersionString { get { return sqlServer.VersionString; } } /// <summary> /// 获取服务器时间 /// </summary> public string ServerTime { get { return sqlServer.ServerTime; } } /// <summary> /// 获取系统服务名称 /// </summary> public string ServiceName { get { return sqlServer.ServiceName; } } /// <summary> /// 获取或设置系统服务是否自动启动 /// </summary> public bool AutostartServer { get { return sqlServer.Registry.AutostartServer; } set { sqlServer.Registry.AutostartServer = value; } } /// <summary> /// 获取字符集设置 /// </summary> public string CharacterSet { get { return sqlServer.Registry.CharacterSet; } } /// <summary> /// 获取服务器物理内存大小(MB) /// </summary> public int PhysicalMemory { get { return sqlServer.Registry.PhysicalMemory; } } /// <summary> /// 获取服务器处理器(CPU)数量 /// </summary> public int NumberOfProcessors { get { return sqlServer.Registry.NumberOfProcessors; } } #endregion #region Public Method /// <summary> /// 获取网络内所有可用的服务器 /// </summary> /// <returns></returns> public static string[] ListAvailableSQLServers() { NameList servers = new ApplicationClass().ListAvailableSQLServers(); if (servers.Count <= 0) return new string[0]; ArrayList list = new ArrayList(servers.Count); foreach (object o in servers) list.Add(o); return (string[])list.ToArray(typeof(string)); } /// <summary> /// 断开数据库所有连接 /// </summary> /// <param name="dbName"></param> public void KillAllProcess(string dbName) { QueryResults qr = sqlServer.EnumProcesses(-1) ; // 获取SPID和DBNAME字段列序号 int iColPIDNum = -1 ; int iColDbName = -1 ; for(int i = 1; i <= qr.Columns; i++) { string strName = qr.get_ColumnName(i) ; if (strName.ToUpper().Trim() == "SPID") iColPIDNum = i ; else if (strName.ToUpper().Trim() == "DBNAME") iColDbName = i ; if (iColPIDNum != -1 && iColDbName != -1) break ; } // 将指定数据库的连接全部断开 for(int i = 1; i <= qr.Rows; i++) { int lPID = qr.GetColumnLong(i,iColPIDNum); string strDBName = qr.GetColumnString(i, iColDbName); if (string.Compare(strDBName, "test", true) == 0) sqlServer.KillProcess(lPID); } } /// <summary> /// 获取数据库信息 /// </summary> /// <param name="dbName"></param> /// <returns></returns> public DatabaseInfo GetDatabaseInfo(string dbName) { Database db = GetDatabase(dbName); if (db == null) throw new Exception("Database not exists!"); DatabaseInfo info = new DatabaseInfo(); info.Name = db.Name; info.Owner = db.Owner; info.PrimaryFilePath = db.PrimaryFilePath; info.CreateDate = db.CreateDate; info.Size = db.Size; info.SpaceAvailable = db.SpaceAvailableInMB; DBFile primary = db.FileGroups.Item("PRIMARY").DBFiles.Item(1); info.PrimaryName = primary.Name; info.PrimaryFilename = primary.PhysicalName.Trim(); info.PrimarySize = primary.Size; info.PrimaryMaxSize = primary.MaximumSize; _LogFile log = db.TransactionLog.LogFiles.Item(1); info.LogName = log.Name; info.LogFilename = log.PhysicalName.Trim(); info.LogSize = log.Size; info.LogMaxSize = log.MaximumSize; return info; } /// <summary> /// 分离数据库 /// </summary> /// <param name="dbName"></param> /// <remarks> /// 分离前最好调用KillAllProcess关闭所有连接,否则分离可能失败。 /// </remarks> public void DetachDB(string dbName) { sqlServer.DetachDB(dbName, true); } /// <summary> /// 附加数据库 /// </summary> /// <param name="dbName"></param> /// <param name="dbFile"></param> /// <example> /// <code> /// SqlDmoHelper dmo = new SqlDmoHelper("(local)", "sa", "sa"); /// dmo.AttachDB("test", @"d:\temp\database\test_data.mdf"); /// </code> /// </example> public void AttachDB(string dbName, string dbFile) { sqlServer.AttachDB(dbName, dbFile); } /// <summary> /// 删除数据库(文件也将被删除) /// </summary> /// <param name="dbName"></param> public void KillDB(string dbName) { sqlServer.KillDatabase(dbName); } /// <summary> /// 创建数据库 /// </summary> /// <param name="dbName">数据库名称</param> /// <param name="path">数据文件保存路径</param> /// <param name="primaryFilename">数据库文件名(不含路径)</param> /// <param name="logFilename">日志文件名(不含路径)</param> /// <example> /// <code> /// SqlDmoHelper dmo = new SqlDmoHelper("(local)", "sa", "sa"); /// dmo.CreateDB("test1", @"d:\temp\database", "abc.mdf", "abc1.ldf"); /// </code> /// </example> public void CreateDB(string dbName, string path, string primaryFilename, string logFilename) { // 创建数据库文件 DBFile dbFile = new DBFileClass(); dbFile.Name = dbName + "_Data"; dbFile.PhysicalName = Path.Combine(path, primaryFilename); dbFile.PrimaryFile = true; //dbFile.Size = 2; // 设置初始化大小(MB) //dbFile.FileGrowthType = SQLDMO_GROWTH_TYPE.SQLDMOGrowth_MB; // 设置文件增长方式 //dbFile.FileGrowth=1; // 设置增长幅度 // 创建日志文件 _LogFile logFile = new LogFileClass(); logFile.Name = dbName + "_Log"; logFile.PhysicalName = Path.Combine(path, logFilename); //logFile.Size = 3; //logFile.FileGrowthType=SQLDMO_GROWTH_TYPE.SQLDMOGrowth_MB; //logFile.FileGrowth=1; // 创建数据库 Database db = new DatabaseClass(); db.Name = dbName; db.FileGroups.Item("PRIMARY").DBFiles.Add(dbFile); db.TransactionLog.LogFiles.Add(logFile); // 建立数据库联接,并添加数据库到服务器 sqlServer.Databases.Add(db); } /// <summary> /// 备份数据库 /// </summary> /// <param name="dbName"></param> /// <param name="bakFile"></param> /// <param name="bakSetName"></param> /// <param name="bakDescription"></param> /// <example> /// <code> /// SqlDmoHelper dmo = new SqlDmoHelper("(local)", "sa", "sa"); /// dmo.BackupDB("test", @"d:\temp\database\test.bak", "手动备份1", "备份说明..."); /// </code> /// </example> public void BackupDB(string dbName, string bakFile, string bakSetName, string bakDescription) { Backup oBackup = new BackupClass(); oBackup.Action = SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database; oBackup.Database = dbName; oBackup.Files = bakFile; oBackup.BackupSetName = bakSetName; oBackup.BackupSetDescription = bakDescription; oBackup.Initialize = true; oBackup.SQLBackup(sqlServer); } /// <summary> /// 恢复数据库 /// </summary> /// <param name="dbName"></param> /// <param name="bakFile"></param> /// <remarks> /// 恢复前最好调用KillAllProcess关闭所有连接,否则恢复可能失败。 /// </remarks> /// <example> /// <code> /// SqlDmoHelper dmo = new SqlDmoHelper("(local)", "sa", "sa"); /// dmo.RestoreDB("test", @"d:\temp\database\test.bak"); /// </code> /// </example> public void RestoreDB(string dbName, string bakFile) { Restore oRestore = new RestoreClass(); oRestore.Action = SQLDMO_RESTORE_TYPE.SQLDMORestore_Database; oRestore.Database = dbName; oRestore.Files = bakFile; oRestore.FileNumber = 1; oRestore.ReplaceDatabase = true; oRestore.SQLRestore(sqlServer); } /// <summary> /// 收缩数据库 /// </summary> /// <param name="dbName"></param> public void ShrinkDB(string dbName) { Database db = GetDatabase(dbName); if (db == null) throw new Exception("Database not exists!"); db.Shrink(0, SQLDMO_SHRINK_TYPE.SQLDMOShrink_Default); } /// <summary> /// 获取所有的数据库名 /// </summary> /// <returns></returns> public string[] ListAllDatabase() { ArrayList list = new ArrayList(); foreach(Database d in sqlServer.Databases) { list.Add(d.Name); } if (list.Count == 0) return new string[0]; else return (string[])list.ToArray(typeof(string)); } /// <summary> /// 获取所有登录名 /// </summary> /// <returns></returns> /// <remarks> /// 管理工具 "安全性->登录" /// </remarks> public string[] ListAllLogins() { ArrayList list = new ArrayList(); foreach(Login d in sqlServer.Logins) { list.Add(d.Name); } if (list.Count == 0) return new string[0]; else return (string[])list.ToArray(typeof(string)); } /// <summary> /// 获取全部数据表名称 /// </summary> /// <param name="dbName"></param> /// <returns></returns> public string[] ListAllTables(string dbName) { Database db = GetDatabase(dbName); if (db == null) throw new Exception("Database not exists!"); ArrayList list = new ArrayList(); foreach(Table t in db.Tables) { list.Add(t.Name); } if (list.Count == 0) return new string[0]; else return (string[])list.ToArray(typeof(string)); } /// <summary> /// 获取全部存储过程名称 /// </summary> /// <param name="dbName"></param> /// <returns></returns> public string[] ListAllStoredProcedure(string dbName) { Database db = GetDatabase(dbName); if (db == null) throw new Exception("Database not exists!"); ArrayList list = new ArrayList(); foreach(StoredProcedure sp in db.StoredProcedures) { list.Add(sp.Name); } if (list.Count == 0) return new string[0]; else return (string[])list.ToArray(typeof(string)); } /// <summary> /// 获取数据库对象 /// </summary> /// <param name="dbName"></param> /// <returns></returns> /// <remarks> /// 可以通过数据库对象获取数据库内表、存储过程、触发器、数据类型等信息。 /// </remarks> /// <example> /// 显示数据库中所有表及其结构 /// <code> /// SqlDmoHelper dmo = new SqlDmoHelper("(local)", "sa", "sa"); /// SQLDMO.Database db = dmo.GetDatabase("test"); /// foreach(SQLDMO.Table t in db.Tables) /// { /// Console.WriteLine("Table:{0}", t.Name); /// for (int i = 1; i <= t.Columns.Count; i++) // SQLDMO所有索引序号从1开始 /// { /// SQLDMO._Column col = t.Columns.Item(i); /// Console.WriteLine(" Column:{0} DataType:{1}", col.Name, col.Datatype); /// } /// /// Console.WriteLine("---------------"); /// } /// </code> /// </example> public Database GetDatabase(string dbName) { foreach(Database d in sqlServer.Databases) { if (string.Compare(d.Name, dbName, true) == 0) return d; } return null; } #endregion } }
封装SQLDMO操作的类相关推荐
- 【博主推荐】Python 基于Xlwings、Openpyxl自己重新封装Python操作Excel类
1.简介:Python操作Excel,常用Xlwings.Openpyxl类,由于其知识琐碎,使用起来不太方便,因此自己把常用用法重新封装一个操作类. 2.应用场景:使用Python操作Excel,读 ...
- 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive
第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive ...
- QT 操作excel 类封装(转载)
QT 操作excel 类封装(转载) 原链接:http://blog.csdn.net/liliming1234/article/details/7054941 pro file [plain] v ...
- 简单封装浏览器 cookie 工具类
版权声明:本文首发 http://asing1elife.com ,转载请注明出处. https://blog.csdn.net/asing1elife/article/details/8265571 ...
- httpurlconnection 封装_不要再封装各种Util工具类了,看看这个框架
不要再封装各种Util工具类了,看看这个框架 Hutool 谐音 "糊涂",寓意追求 "万事都作糊涂观,无所谓失,无所谓得" 的境界. Hutool 是一 ...
- php函数、类和对象以及类的封装、继承、类的静态方法、静态属性
php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 原文:php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 1.函数 php内置函数可以直接使用,如果没有安装php扩展即可 ...
- discuz mysql类_Discuz论坛教程之数据库操作DB类和C::t类介绍
Discuz论坛教程之数据库操作DB类和C::t类介绍 类定义文件 DB类: 文件\source\class\class_core.php [php]view plaincopy classDB ex ...
- 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫...
前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,这样很容易被服务器封IP,因此需要设置IP代理,但又不想花钱买,网上有免费IP代理,但大多都数都是不可 ...
- java8:封装lambda泛型工具类之list转为map
1 史上最简单入门:java8的lambda中的map相关操作:基础及注意事项图文详解 2 java8的lambda中collect接口案例及原理详解,官方文档解读 3 java8:封装l ...
最新文章
- 《Linux内核设计与实现》读书笔记(十)- 内核同步方法【转】
- ubuntu 16.04 安装教程
- ubuntu 安装 php
- html5在线api,HTML5+ API Reference
- 编码原理(附一)--算术编码
- 下载IEEE 论文模板的方法
- python 抓取网页工具
- 研究了一晚上,填补了中国古代神话中的一些空白
- [Qt]setGeometry: Unable to set geometry……问题的解决方案
- 阿里云Oss水印图片处理Utils
- 超级好上手的告白小程序
- 学python重点是什么_如果只有1小时学Python,看这篇就够了
- 仿淘宝、京东多重商品属性组合Sku标签
- JavaScript实现公历转换农历
- 网易云音乐api,登录出现 网络太拥挤
- TIOBE 11 月编程语言:Java 首次跌出前二;基于Pytorch的Kornia可微分计算机视觉库开源...
- tyvj P2018 「Nescafé26」小猫爬山 解题报告
- 图书管理系统模块,通过模糊查询实现查找图书的功能
- OC—网络监控 使用Reachability
- 什么录音软件可以录制电脑内部播放的声音
热门文章
- Centos6.5_x86_64 编译安装Subversion-1.8.5
- uva 10801 Lift Hopping
- nyoj 12(区间覆盖)
- Python之functools.reduce使用
- Codevs 1519 过路费(Mst+Lca)
- python 学习 [day6]
- tomcat配置多个web网站的配置详解
- Spring MVC+Spring +Hibernate配置事务,但是事务不起作用
- 内存管理之虚拟页式分配
- WeekDay TO DateTime