SQL Server編程系列(2):SMO經常使用對象的有關操做

在上一篇周公簡單講述了SMO的一些基本概念,實際上SMO體系結構遠不止周公在上一篇中講述的那麼簡單,下圖是MSDN上給出的一個完整的結構圖:

 

 

 

 

上圖是一個完整的涉及到各類關係的結構圖。不過它們之間的層次結構關係周公已經在上一篇作了簡單概述。
在本篇中周公仍是在上一篇的基礎上再作稍微深刻一點的介紹,在本篇中主要講述如何獲取數據庫常見對象信息,而且如何利用SMO來進行一些平常操做:如建立Login,建立數據庫、備份數據庫和還原數據庫。執行上面這些操做的SQL語句也許咱們已經寫過,下面咱們來看看利用SMO來操做的代碼將如何寫。
代碼以下:
 
   
   
   
   
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using Microsoft.SqlServer.Management.Smo.RegisteredServers;//在microsoft.sqlserver.smo.dll中 
  6. using Microsoft.SqlServer.Management.Smo;//需添加microsoft.sqlserver.smo.dll的引用 
  7. using Microsoft.SqlServer.Management.Common;//需添加microsoft.sqlserver.connectioninfo.dll的引用 
  8. namespace SSISStudy 
  9.     /// <summary> 
  10.     /// SQL Server編程些列文章(2):SMO經常使用對象的有關操做 
  11.     /// 做者:周公  
  12.     /// 建立日期:2012-05-23  
  13.     /// 博客地址:http://blog.csdn.net/zhoufoxcn http://zhoufoxcn.blog.51cto.com  
  14.     /// 新浪微博地址:http://weibo.com/zhoufoxcn   
  15.     class SMODemo02 
  16.     { 
  17.         /// <summary> 
  18.         /// 顯示數據庫常見對象信息示例 
  19.         /// </summary> 
  20.         public static void ShowSMOObjects() 
  21.         { 
  22.             Console.WriteLine("Server Group Information"); 
  23.             foreach (ServerGroup serverGroup in SmoApplication.SqlServerRegistrations.ServerGroups) 
  24.             { 
  25.                 Console.WriteLine("Group Name:{0},Path:{1},ServerType:{2},State:{3},Urn:{4}", serverGroup.Name, serverGroup.Path, serverGroup.ServerType, serverGroup.State, serverGroup.Urn); 
  26.             } 
  27.             Console.WriteLine("Registered Server Information"); 
  28.             foreach (RegisteredServer regServer in SmoApplication.SqlServerRegistrations.RegisteredServers) 
  29.             { 
  30.                 Console.WriteLine("Server Name:{0},Login:{1},State:{2},Urn:{3}", regServer.Name, regServer.Login, regServer.State, regServer.Urn); 
  31.             } 
  32.             //建立ServerConnection的實例 
  33.             ServerConnection connection = new ServerConnection(); 
  34.             //指定鏈接字符串 
  35.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"
  36.             //實例化Server 
  37.             Server server = new Server(connection); 
  38.             Console.WriteLine("ActiveDirectory:{0},InstanceName:{1}", server.ActiveDirectory, server.InstanceName); 
  39.             //下面列出每一個數據庫的具體信息 
  40.             foreach (Database db in server.Databases) 
  41.             { 
  42.                 Console.WriteLine("Database Name:{0},ActiveDirectory:{1},ActiveConnections:{2},DataSpaceUsage:{3},PrimaryFilePath:{4}", db.Name, db.ActiveDirectory, db.ActiveConnections, db.DataSpaceUsage, db.PrimaryFilePath); 
  43.                 //列出數據庫的數據文件文件組信息 
  44.                 foreach (FileGroup fileGroup in db.FileGroups) 
  45.                 { 
  46.                     Console.WriteLine("\tFileGroup Name:{0},Size:{1},State:{2},Urn:{3}", fileGroup.Name, fileGroup.Size, fileGroup.State, fileGroup.Urn); 
  47.                     //列出每一個文件組中的數據文件信息 
  48.                     foreach (DataFile dataFile in fileGroup.Files) 
  49.                     { 
  50.                         Console.WriteLine("\t\tDataFile Name:{0},Size:{1},State:{2},Urn:{3},FileName:{4}", dataFile.Name, dataFile.Size, dataFile.State, dataFile.Urn, dataFile.FileName); 
  51.                     } 
  52.                 } 
  53.                 //列出數據庫日誌文件信息 
  54.                 foreach (LogFile logFile in db.LogFiles) 
  55.                 { 
  56.                     Console.WriteLine("\tLogFile Name:{0},Size:{1},State:{2},Urn:{3},FileName:{4}", logFile.Name, logFile.Size, logFile.State,logFile.Urn,logFile.FileName); 
  57.                 } 
  58.             } 
  59.         } 
  60.         /// <summary> 
  61.         /// 利用SMO建立SQL登陸 
  62.         /// </summary> 
  63.         public static void CreateLogin() 
  64.         { 
  65.             string loginName = "zhoufoxcn";//要建立的數據庫登陸名 
  66.             string loginPassword = "C#.NET";//登陸密碼 
  67.             //建立ServerConnection的實例 
  68.             ServerConnection connection = new ServerConnection(); 
  69.             //指定鏈接字符串 
  70.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"
  71.             //實例化Server 
  72.             Server server = new Server(connection); 
  73.             #region [建立數據庫登陸對象] 
  74.             //檢查在數據庫是否已經存在該登陸名 
  75.             var queryLogin = from Login temp in server.Logins 
  76.                              where string.Equals(temp.Name, loginName, StringComparison.CurrentCultureIgnoreCase) 
  77.                              select temp; 
  78.             Login login = queryLogin.FirstOrDefault<Login>(); 
  79.             //若是存在就刪除 
  80.             if (login != null
  81.             { 
  82.                 login.Drop(); 
  83.             } 
  84.             login = new Login(server, loginName); 
  85.             login.LoginType = LoginType.SqlLogin;//指定登陸方式爲SQL認證 
  86.             login.PasswordPolicyEnforced = true
  87.             login.DefaultDatabase = "master";//默認數據庫 
  88.             login.Create(loginPassword); 
  89.             #endregion 
  90.         } 
  91.         /// <summary> 
  92.         /// 利用SMO建立數據庫 
  93.         /// </summary> 
  94.         public static void CreateDatabase() 
  95.         { 
  96.             string databaseName = "SMODemo"
  97.             //建立ServerConnection的實例 
  98.             ServerConnection connection = new ServerConnection(); 
  99.             //指定鏈接字符串 
  100.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"
  101.             //實例化Server 
  102.             Server server = new Server(connection); 
  103.             #region [建立數據庫對象] 
  104.             //檢查在數據庫是否已經存在該數據庫 
  105.             var queryDatabase = from Database temp in server.Databases 
  106.                                 where string.Equals(temp.Name, databaseName, StringComparison.CurrentCultureIgnoreCase) 
  107.                                 select temp; 
  108.             Database database = queryDatabase.FirstOrDefault<Database>(); 
  109.             //若是存在就刪除 
  110.             if (database != null
  111.             { 
  112.                 database.Drop(); 
  113.             } 
  114.             database = new Database(server, databaseName); 
  115.             //指定數據庫數據文件細節 
  116.             FileGroup fileGroup = new FileGroup { Name = "PRIMARY", Parent = database, IsDefault = true }; 
  117.             DataFile dataFile = new DataFile 
  118.             { 
  119.                 Name = databaseName + "_data"
  120.                 Parent = fileGroup, 
  121.                 FileName = @"F:\SQLData2005\" + databaseName + ".mdf" 
  122.             }; 
  123.             fileGroup.Files.Add(dataFile); 
  124.             //指定數據庫日誌文件細節 
  125.             LogFile logFile = new LogFile 
  126.             { 
  127.                 Name = databaseName + "_log"
  128.                 Parent = database, 
  129.                 FileName = @"F:\SQLData2005\" + databaseName + ".ldf" 
  130.             }; 
  131.             database.FileGroups.Add(fileGroup); 
  132.             database.LogFiles.Add(logFile); 
  133.             database.Create(); 
  134.             #endregion 
  135.         } 
  136.         /// <summary> 
  137.         /// 利用SMO備份數據庫 
  138.         /// </summary> 
  139.         public static void BackupDatabase() 
  140.         { 
  141.             string databaseName = "msdb";//備份的數據庫名 
  142.             string bkPath = @"C:\";//存放備份後的數據的文件夾 
  143.             //建立ServerConnection的實例 
  144.             ServerConnection connection = new ServerConnection(); 
  145.             //指定鏈接字符串 
  146.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"
  147.             //實例化Server 
  148.             Server server = new Server(connection); 
  149.             #region [建立數據庫備份對象] 
  150.             Backup backup = new Backup(); 
  151.             backup.Action = BackupActionType.Database;//徹底備份 
  152.             backup.Database = databaseName; 
  153.             backup.BackupSetDescription = "Full backup of master"
  154.             backup.BackupSetName = "master Backup"
  155.             //建立備份設備 
  156.             BackupDeviceItem bkDeviceItem = new BackupDeviceItem(); 
  157.             bkDeviceItem.DeviceType = DeviceType.File; 
  158.             bkDeviceItem.Name = bkPath+databaseName+".bak"
  159.             backup.Devices.Add(bkDeviceItem); 
  160.             backup.Incremental = false
  161.             backup.LogTruncation = BackupTruncateLogType.Truncate; 
  162.             backup.SqlBackup(server); 
  163.             #endregion 
  164.         } 
  165.         /// <summary> 
  166.         /// 備份數據庫 
  167.         /// </summary> 
  168.         public static void RestoreDatabase() 
  169.         { 
  170.             string databaseName = "SMODemo";//備份的數據庫名 
  171.             string bkPath = @"C:\";//存放備份後的數據的文件夾 
  172.             //建立ServerConnection的實例 
  173.             ServerConnection connection = new ServerConnection(); 
  174.             //指定鏈接字符串 
  175.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"
  176.             //實例化Server 
  177.             Server server = new Server(connection); 
  178.             Restore restore = new Restore(); 
  179.             restore.NoRecovery = false
  180.             restore.NoRewind = false
  181.             restore.Action = RestoreActionType.Database; 
  182.             restore.Database = databaseName; 
  183.             //建立備份設備 
  184.             BackupDeviceItem bkDeviceItem = new BackupDeviceItem(); 
  185.             bkDeviceItem.DeviceType = DeviceType.File; 
  186.             bkDeviceItem.Name = bkPath + databaseName + ".bak"
  187.             //若是須要從新制定Restore後的數據庫的物理文件位置,須要知道數據庫文件的邏輯文件名 
  188.             //能夠RESTORE FILELISTONLY 來列出邏輯文件名,若是覆蓋已有數據庫能夠經過SMO來獲取 
  189.             //因本處使用的是剛剛備份的msdb數據庫來Restore,因此其分別爲"MSDBData"和"MSDBLog" 
  190.             //若是不指定Restore路徑則默認恢復到數據庫服務器存放數據的文件夾下 
  191.             RelocateFile relocateDataFile = new RelocateFile { LogicalFileName = "MSDBData", PhysicalFileName = bkPath + databaseName + ".mdf" };//(databaseName + "_data", bkPath + databaseName + ".mdf"); 
  192.             RelocateFile relocateLogFile = new RelocateFile { LogicalFileName = "MSDBLog", PhysicalFileName = bkPath + databaseName + ".ldf" };//(databaseName + "_log", bkPath + databaseName + ".ldf"); 
  193.             restore.Devices.Add(bkDeviceItem); 
  194.             restore.RelocateFiles.Add(relocateDataFile); 
  195.             restore.RelocateFiles.Add(relocateLogFile); 
  196.             restore.SqlRestore(server); 
  197.         } 
  198.     } 
執行結果在這裏就不貼圖了,反正是是在周公家裏的中文環境和辦公室英文環境中測試經過。預先透漏一下,下一篇將講述如何獲取SQL Server的對象的建立SQL語句,好比表、存儲過程、函數等。
2012-05-23
周公
相關文章
相關標籤/搜索