码迷,mamicode.com
首页 > 数据库 > 详细

SQL Server编程系列(2):SMO常用对象的有关操作

时间:2015-12-14 20:57:38      阅读:306      评论:0      收藏:0      [点我收藏+]

标签:

在上一篇讲述了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. { 
  10.     /// <summary> 
  11.     /// SQL Server编程些列文章(2):SMO常用对象的有关操作 
  12.     /// 作者:周公  
  13.     /// 创建日期:2012-05-23  
  14.     /// 博客地址:http://blog.csdn.net/zhoufoxcn http://zhoufoxcn.blog.51cto.com  
  15.     /// 新浪微博地址:http://weibo.com/zhoufoxcn   
  16.     class SMODemo02 
  17.     { 
  18.         /// <summary> 
  19.         /// 显示数据库常见对象信息示例 
  20.         /// </summary> 
  21.         public static void ShowSMOObjects() 
  22.         { 
  23.             Console.WriteLine("Server Group Information"); 
  24.             foreach (ServerGroup serverGroup in SmoApplication.SqlServerRegistrations.ServerGroups) 
  25.             { 
  26.                 Console.WriteLine("Group Name:{0},Path:{1},ServerType:{2},State:{3},Urn:{4}", serverGroup.Name, serverGroup.Path, serverGroup.ServerType, serverGroup.State, serverGroup.Urn); 
  27.             } 
  28.             Console.WriteLine("Registered Server Information"); 
  29.             foreach (RegisteredServer regServer in SmoApplication.SqlServerRegistrations.RegisteredServers) 
  30.             { 
  31.                 Console.WriteLine("Server Name:{0},Login:{1},State:{2},Urn:{3}", regServer.Name, regServer.Login, regServer.State, regServer.Urn); 
  32.             } 
  33.             //创建ServerConnection的实例 
  34.             ServerConnection connection = new ServerConnection(); 
  35.             //指定连接字符串 
  36.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"; 
  37.             //实例化Server 
  38.             Server server = new Server(connection); 
  39.             Console.WriteLine("ActiveDirectory:{0},InstanceName:{1}", server.ActiveDirectory, server.InstanceName); 
  40.             //下面列出每个数据库的具体信息 
  41.             foreach (Database db in server.Databases) 
  42.             { 
  43.                 Console.WriteLine("Database Name:{0},ActiveDirectory:{1},ActiveConnections:{2},DataSpaceUsage:{3},PrimaryFilePath:{4}", db.Name, db.ActiveDirectory, db.ActiveConnections, db.DataSpaceUsage, db.PrimaryFilePath); 
  44.                 //列出数据库的数据文件文件组信息 
  45.                 foreach (FileGroup fileGroup in db.FileGroups) 
  46.                 { 
  47.                     Console.WriteLine("\tFileGroup Name:{0},Size:{1},State:{2},Urn:{3}", fileGroup.Name, fileGroup.Size, fileGroup.State, fileGroup.Urn); 
  48.                     //列出每个文件组中的数据文件信息 
  49.                     foreach (DataFile dataFile in fileGroup.Files) 
  50.                     { 
  51.                         Console.WriteLine("\t\tDataFile Name:{0},Size:{1},State:{2},Urn:{3},FileName:{4}", dataFile.Name, dataFile.Size, dataFile.State, dataFile.Urn, dataFile.FileName); 
  52.                     } 
  53.                 } 
  54.                 //列出数据库日志文件信息 
  55.                 foreach (LogFile logFile in db.LogFiles) 
  56.                 { 
  57.                     Console.WriteLine("\tLogFile Name:{0},Size:{1},State:{2},Urn:{3},FileName:{4}", logFile.Name, logFile.Size, logFile.State,logFile.Urn,logFile.FileName); 
  58.                 } 
  59.             } 
  60.         } 
  61.         /// <summary> 
  62.         /// 利用SMO创建SQL登录 
  63.         /// </summary> 
  64.         public static void CreateLogin() 
  65.         { 
  66.             string loginName = "zhoufoxcn";//要创建的数据库登录名 
  67.             string loginPassword = "C#.NET";//登录密码 
  68.             //创建ServerConnection的实例 
  69.             ServerConnection connection = new ServerConnection(); 
  70.             //指定连接字符串 
  71.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"; 
  72.             //实例化Server 
  73.             Server server = new Server(connection); 
  74.             #region [创建数据库登录对象] 
  75.             //检查在数据库是否已经存在该登录名 
  76.             var queryLogin = from Login temp in server.Logins 
  77.                              where string.Equals(temp.Name, loginName, StringComparison.CurrentCultureIgnoreCase) 
  78.                              select temp; 
  79.             Login login = queryLogin.FirstOrDefault<Login>(); 
  80.             //如果存在就删除 
  81.             if (login != null) 
  82.             { 
  83.                 login.Drop(); 
  84.             } 
  85.             login = new Login(server, loginName); 
  86.             login.LoginType = LoginType.SqlLogin;//指定登录方式为SQL认证 
  87.             login.PasswordPolicyEnforced = true; 
  88.             login.DefaultDatabase = "master";//默认数据库 
  89.             login.Create(loginPassword); 
  90.             #endregion 
  91.         } 
  92.         /// <summary> 
  93.         /// 利用SMO创建数据库 
  94.         /// </summary> 
  95.         public static void CreateDatabase() 
  96.         { 
  97.             string databaseName = "SMODemo"; 
  98.             //创建ServerConnection的实例 
  99.             ServerConnection connection = new ServerConnection(); 
  100.             //指定连接字符串 
  101.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"; 
  102.             //实例化Server 
  103.             Server server = new Server(connection); 
  104.             #region [创建数据库对象] 
  105.             //检查在数据库是否已经存在该数据库 
  106.             var queryDatabase = from Database temp in server.Databases 
  107.                                 where string.Equals(temp.Name, databaseName, StringComparison.CurrentCultureIgnoreCase) 
  108.                                 select temp; 
  109.             Database database = queryDatabase.FirstOrDefault<Database>(); 
  110.             //如果存在就删除 
  111.             if (database != null) 
  112.             { 
  113.                 database.Drop(); 
  114.             } 
  115.             database = new Database(server, databaseName); 
  116.             //指定数据库数据文件细节 
  117.             FileGroup fileGroup = new FileGroup { Name = "PRIMARY", Parent = database, IsDefault = true }; 
  118.             DataFile dataFile = new DataFile 
  119.             { 
  120.                 Name = databaseName + "_data", 
  121.                 Parent = fileGroup, 
  122.                 FileName = @"F:\SQLData2005\" + databaseName + ".mdf" 
  123.             }; 
  124.             fileGroup.Files.Add(dataFile); 
  125.             //指定数据库日志文件细节 
  126.             LogFile logFile = new LogFile 
  127.             { 
  128.                 Name = databaseName + "_log", 
  129.                 Parent = database, 
  130.                 FileName = @"F:\SQLData2005\" + databaseName + ".ldf" 
  131.             }; 
  132.             database.FileGroups.Add(fileGroup); 
  133.             database.LogFiles.Add(logFile); 
  134.             database.Create(); 
  135.             #endregion 
  136.         } 
  137.         /// <summary> 
  138.         /// 利用SMO备份数据库 
  139.         /// </summary> 
  140.         public static void BackupDatabase() 
  141.         { 
  142.             string databaseName = "msdb";//备份的数据库名 
  143.             string bkPath = @"C:\";//存放备份后的数据的文件夹 
  144.             //创建ServerConnection的实例 
  145.             ServerConnection connection = new ServerConnection(); 
  146.             //指定连接字符串 
  147.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"; 
  148.             //实例化Server 
  149.             Server server = new Server(connection); 
  150.             #region [创建数据库备份对象] 
  151.             Backup backup = new Backup(); 
  152.             backup.Action = BackupActionType.Database;//完全备份 
  153.             backup.Database = databaseName; 
  154.             backup.BackupSetDescription = "Full backup of master"; 
  155.             backup.BackupSetName = "master Backup"; 
  156.             //创建备份设备 
  157.             BackupDeviceItem bkDeviceItem = new BackupDeviceItem(); 
  158.             bkDeviceItem.DeviceType = DeviceType.File; 
  159.             bkDeviceItem.Name = bkPath+databaseName+".bak"; 
  160.             backup.Devices.Add(bkDeviceItem); 
  161.             backup.Incremental = false; 
  162.             backup.LogTruncation = BackupTruncateLogType.Truncate; 
  163.             backup.SqlBackup(server); 
  164.             #endregion 
  165.         } 
  166.         /// <summary> 
  167.         /// 备份数据库 
  168.         /// </summary> 
  169.         public static void RestoreDatabase() 
  170.         { 
  171.             string databaseName = "SMODemo";//备份的数据库名 
  172.             string bkPath = @"C:\";//存放备份后的数据的文件夹 
  173.             //创建ServerConnection的实例 
  174.             ServerConnection connection = new ServerConnection(); 
  175.             //指定连接字符串 
  176.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"; 
  177.             //实例化Server 
  178.             Server server = new Server(connection); 
  179.             Restore restore = new Restore(); 
  180.             restore.NoRecovery = false; 
  181.             restore.NoRewind = false; 
  182.             restore.Action = RestoreActionType.Database; 
  183.             restore.Database = databaseName; 
  184.             //创建备份设备 
  185.             BackupDeviceItem bkDeviceItem = new BackupDeviceItem(); 
  186.             bkDeviceItem.DeviceType = DeviceType.File; 
  187.             bkDeviceItem.Name = bkPath + databaseName + ".bak"; 
  188.             //如果需要重新制定Restore后的数据库的物理文件位置,需要知道数据库文件的逻辑文件名 
  189.             //可以RESTORE FILELISTONLY 来列出逻辑文件名,如果覆盖已有数据库可以通过SMO来获取 
  190.             //因本处使用的是刚刚备份的msdb数据库来Restore,所以其分别为"MSDBData"和"MSDBLog" 
  191.             //如果不指定Restore路径则默认恢复到数据库服务器存放数据的文件夹下 
  192.             RelocateFile relocateDataFile = new RelocateFile { LogicalFileName = "MSDBData", PhysicalFileName = bkPath + databaseName + ".mdf" };//(databaseName + "_data", bkPath + databaseName + ".mdf"); 
  193.             RelocateFile relocateLogFile = new RelocateFile { LogicalFileName = "MSDBLog", PhysicalFileName = bkPath + databaseName + ".ldf" };//(databaseName + "_log", bkPath + databaseName + ".ldf"); 
  194.             restore.Devices.Add(bkDeviceItem); 
  195.             restore.RelocateFiles.Add(relocateDataFile); 
  196.             restore.RelocateFiles.Add(relocateLogFile); 
  197.             restore.SqlRestore(server); 
  198.         } 
  199.     } 
  200. } 
执行结果在这里就不贴图了,反正是是在周公家里的中文环境和办公室英文环境中测试通过。预先透漏一下,下一篇将讲述如何获取SQL Server的对象的创建SQL语句,比如表、存储过程、函数等。

SQL Server编程系列(2):SMO常用对象的有关操作

标签:

原文地址:http://www.cnblogs.com/Alenliu/p/5046116.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!