1. 程式人生 > >C#封裝SQLDMO操作SQL Server 2000的類

C#封裝SQLDMO操作SQL Server 2000的類

封裝SQLDMO操作的類,能完成常用的SQL Server 2000管理工作。
使用前請新增 "Microsoft SQLDMO Object Library" COM 引用。
有部分程式碼借鑑網路資料,再次向原作者表示感謝。

/* **********************************************
* Rainsoft Development Library for Microsoft.NET
* Author: Q.yuhen ([email protected])
********************************************** */ 
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.IO;
using SQLDMO;

namespace Rainsoft.Data
{
///


/// SQLDMO輔助類
///
/// 
/// 使用前新增 "Microsoft SQLDMO Object Library" COM 引用。
/// 
public class SqlDmoHelper
{
    #region DatabaseInfo

    ///


    /// 資料庫資訊
    ///
    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

    ///


    /// 獲取主要版本號
    ///
    public string Version
    {
      get 
      { 
        return string.Format("{0}.{1}", sqlServer.VersionMajor, sqlServer.VersionMinor); 
      }
    }

    ///


    /// 獲取詳細版本資訊
    ///
    public string VersionString
    {
      get
      {
        return sqlServer.VersionString;
      }
    }

    ///


    /// 獲取伺服器時間
    ///
    public string ServerTime
    {
      get
      {
        return sqlServer.ServerTime;
      }
    }

    ///


    /// 獲取系統服務名稱
    ///
    public string ServiceName
    {
      get
      {
        return sqlServer.ServiceName;
      }
    }

    ///


    /// 獲取或設定系統服務是否自動啟動
    ///
    public bool AutostartServer
    {
      get
      {
        return sqlServer.Registry.AutostartServer;
      }
      set
      {
        sqlServer.Registry.AutostartServer = value;
      }
    }

    ///


    /// 獲取字符集設定
    ///
    public string CharacterSet
    {
      get
      {
        return sqlServer.Registry.CharacterSet;
      }
    }

    ///


    /// 獲取伺服器實體記憶體大小(MB)
    ///
    public int PhysicalMemory
    {
      get
      {
        return sqlServer.Registry.PhysicalMemory;
      }
    }

    ///


    /// 獲取伺服器處理器(CPU)數量
    ///
    public int NumberOfProcessors
    {
      get
      {
        return sqlServer.Registry.NumberOfProcessors;
      }
    }

    #endregion

    #region Public Method

    ///


    /// 獲取網路內所有可用的伺服器
    ///
    /// 
    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));
    }

    ///


    /// 斷開資料庫所有連線
    ///
    /// 
    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); 
      } 
    }

    ///


    /// 獲取資料庫資訊
    ///
    /// 
    /// 
    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;
    }

    ///


    /// 分離資料庫
    ///
    /// 
    /// 
    /// 分離前最好呼叫KillAllProcess關閉所有連線,否則分離可能失敗。
    /// 
    public void DetachDB(string dbName)
    {
      sqlServer.DetachDB(dbName, true);
    }

    ///


    /// 附加資料庫
    ///
    /// 
    /// 
    /// 
    /// 
    /// SqlDmoHelper dmo = new SqlDmoHelper("(local)", "sa", "sa");
    /// dmo.AttachDB("test", @"d:\temp\database\test_data.mdf");
    /// 

    /// 
    public void AttachDB(string dbName, string dbFile)
    {
      sqlServer.AttachDB(dbName, dbFile);
    }

    ///


    /// 刪除資料庫(檔案也將被刪除)
    ///
    /// 
    public void KillDB(string dbName)
    {
      sqlServer.KillDatabase(dbName);
    }

    ///


    /// 建立資料庫
    ///
    /// 資料庫名稱
    /// 資料檔案儲存路徑
    /// 資料庫檔名(不含路徑)
    /// 日誌檔名(不含路徑)
    /// 
    /// 
    /// SqlDmoHelper dmo = new SqlDmoHelper("(local)", "sa", "sa");
    /// dmo.CreateDB("test1", @"d:\temp\database", "abc.mdf", "abc1.ldf");
    /// 

    /// 
    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);
    }

    ///


    /// 備份資料庫
    ///
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    /// SqlDmoHelper dmo = new SqlDmoHelper("(local)", "sa", "sa");
    /// dmo.BackupDB("test", @"d:\temp\database\test.bak", "手動備份1", "備份說明...");
    /// 

    /// 
    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);
    }

    ///


    /// 恢復資料庫
    ///
    /// 
    /// 
    /// 
    /// 恢復前最好呼叫KillAllProcess關閉所有連線,否則恢復可能失敗。
    /// 
    /// 
    /// 
    /// SqlDmoHelper dmo = new SqlDmoHelper("(local)", "sa", "sa");
    /// dmo.RestoreDB("test", @"d:\temp\database\test.bak");
    /// 

    /// 
    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);
    }

    ///


    /// 收縮資料庫
    ///
    /// 
    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);
    }

    ///


    /// 獲取所有的資料庫名
    ///
    /// 
    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));
    }

    ///


    /// 獲取所有登入名
    ///
    /// 
    /// 
    /// 管理工具 "安全性->登入"
    /// 
    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));
    }

    ///


    /// 獲取全部資料表名稱
    ///
    /// 
    /// 
    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));
    }

    ///


    /// 獲取全部儲存過程名稱
    ///
    /// 
    /// 
    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));
    }

    ///


    /// 獲取資料庫物件
    ///
    /// 
    /// 
    /// 
    /// 可以通過資料庫物件獲取資料庫內表、儲存過程、觸發器、資料型別等資訊。
    /// 
    /// 
    /// 顯示資料庫中所有表及其結構
    /// 
    /// 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("---------------");
    /// }
    /// 

    /// 
    public Database GetDatabase(string dbName)
    {
      foreach(Database d in sqlServer.Databases)
      {
        if (string.Compare(d.Name, dbName, true) == 0)
          return d;
      }

      return null;
    }

    #endregion
}
}

//同樣可以獲取所有伺服器名

public ArrayList GetServerList()
        {
            ArrayList alServers = new ArrayList();