在上一篇周公简单讲述了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
周公