封装SQLDMO操作的类,能完成常用的SQL Server 2000管理工作。
使用前请添加 "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 &lt;= 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操作的类相关推荐

  1. 【博主推荐】Python 基于Xlwings、Openpyxl自己重新封装Python操作Excel类

    1.简介:Python操作Excel,常用Xlwings.Openpyxl类,由于其知识琐碎,使用起来不太方便,因此自己把常用用法重新封装一个操作类. 2.应用场景:使用Python操作Excel,读 ...

  2. 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive

    第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive ...

  3. QT 操作excel 类封装(转载)

    QT 操作excel 类封装(转载) 原链接:http://blog.csdn.net/liliming1234/article/details/7054941 pro file [plain]  v ...

  4. 简单封装浏览器 cookie 工具类

    版权声明:本文首发 http://asing1elife.com ,转载请注明出处. https://blog.csdn.net/asing1elife/article/details/8265571 ...

  5. httpurlconnection 封装_不要再封装各种Util工具类了,看看这个框架

    不要再封装各种Util工具类了,看看这个框架 Hutool 谐音 "糊涂",寓意追求 "万事都作糊涂观,无所谓失,无所谓得" 的境界.    Hutool 是一 ...

  6. php函数、类和对象以及类的封装、继承、类的静态方法、静态属性

    php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 原文:php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 1.函数 php内置函数可以直接使用,如果没有安装php扩展即可 ...

  7. discuz mysql类_Discuz论坛教程之数据库操作DB类和C::t类介绍

    Discuz论坛教程之数据库操作DB类和C::t类介绍 类定义文件 DB类: 文件\source\class\class_core.php [php]view plaincopy classDB ex ...

  8. 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫...

    前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,这样很容易被服务器封IP,因此需要设置IP代理,但又不想花钱买,网上有免费IP代理,但大多都数都是不可 ...

  9. java8:封装lambda泛型工具类之list转为map

    1   史上最简单入门:java8的lambda中的map相关操作:基础及注意事项图文详解 2   java8的lambda中collect接口案例及原理详解,官方文档解读 3   java8:封装l ...

最新文章

  1. 《Linux内核设计与实现》读书笔记(十)- 内核同步方法【转】
  2. ubuntu 16.04 安装教程
  3. ubuntu 安装 php
  4. html5在线api,HTML5+ API Reference
  5. 编码原理(附一)--算术编码
  6. 下载IEEE 论文模板的方法
  7. python 抓取网页工具
  8. 研究了一晚上,填补了中国古代神话中的一些空白
  9. [Qt]setGeometry: Unable to set geometry……问题的解决方案
  10. 阿里云Oss水印图片处理Utils
  11. 超级好上手的告白小程序
  12. 学python重点是什么_如果只有1小时学Python,看这篇就够了
  13. 仿淘宝、京东多重商品属性组合Sku标签
  14. JavaScript实现公历转换农历
  15. 网易云音乐api,登录出现 网络太拥挤
  16. TIOBE 11 月编程语言:Java 首次跌出前二;基于Pytorch的Kornia可微分计算机视觉库开源...
  17. tyvj P2018 「Nescafé26」小猫爬山 解题报告
  18. 图书管理系统模块,通过模糊查询实现查找图书的功能
  19. OC—网络监控 使用Reachability
  20. 什么录音软件可以录制电脑内部播放的声音

热门文章

  1. Centos6.5_x86_64 编译安装Subversion-1.8.5
  2. uva 10801 Lift Hopping
  3. nyoj 12(区间覆盖)
  4. Python之functools.reduce使用
  5. Codevs 1519 过路费(Mst+Lca)
  6. python 学习 [day6]
  7. tomcat配置多个web网站的配置详解
  8. Spring MVC+Spring +Hibernate配置事务,但是事务不起作用
  9. 内存管理之虚拟页式分配
  10. WeekDay TO DateTime