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. {
  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语句,比如表、存储过程、函数等。

时间: 2024-10-19 19:21:56

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

SQL Server编程系列(1):SMO介绍

原文:SQL Server编程系列(1):SMO介绍 续篇:SQL Server编程系列(2):SMO常用对象的有关操作 最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己的心得体会,想在此跟大家分享一下,在工作中用到了SMO/SQL CLR/SSIS等方面的知识,在国内这方面的文章并不多见,有也是一些零星的应用,特别是SSIS部分国内外的文章大都是讲解如何拖拽控件的,在开发过程中周公除了参阅SQL Server帮助文档.MSDN及StackOverFlow等网站,这

(转) SQL Server编程系列(1):SMO介绍

最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己的心得体会,想在此跟大家分享一下,在工作中用到了SMO/SQL CLR/SSIS等方面的知识,在国内这方面的文章并不多见,有也是一些零星的应用,特别是SSIS部分国内外的文章大都是讲解如何拖拽控件的,在开发过 程中周公除了参阅SQL Server帮助文档.MSDN及StackOverFlow等网站,这些网站基本上都是英文的,为了便于一些英文不好的开发者学习,周公在自己的理解上 加以整理成系列,不到之处请大家谅解. SM

[转]SQL Server编程:SMO介绍

转自:周公 最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己的心得体会,想在此跟大家分享一下,在工作中用到了SMO/SQL CLR/SSIS等方面的知识,在国内这方面的文章并不多见,有也是一些零星的应用,特别是SSIS部分国内外的文章大都是讲解如何拖拽控件的,在开发过程中周公除了参阅SQL Server帮助文档.MSDN及StackOverFlow等网站,这些网站基本上都是英文的,为了便于一些英文不好的开发者学习,周公在自己的理解上加以整理成系列,不到之处请大家谅解

Sql Server来龙去脉系列之二 框架和配置

数据库对象 数据库维持了一系列表存储所有对象.数据类型/约束/配置项/资源等,在2008种我们叫他们为system base tables,并且这些表我们默认是看不到的.我们可以通过管理员登陆数据库,然后执行脚本: USE master; SELECT name FROM sys.objects WHERE type_desc = 'SYSTEM_TABLE'; 能查看到几十条数据.一般我们是不能查看到这些表里边的任何数据,只有通过DAC方式连接数据库才能查看到数据.这些数据主要被数据库引擎使用

SQL Server虚拟化系列(3)&mdash;&mdash;构建理想的基于VMware的SQL Server虚拟机

虚拟化变得越来越常见,并且在不了解虚拟化如何工作的情况下,DBA在尝试解决性能问题时会出现盲点,例如减少资源争用或改进备份和恢复操作等. 在本文中我们将主要讲述为您的SQL Server工作负载构建理想的基于VMware的虚拟机.我们的下一篇文章将介绍怎么样在Hyper-V上构建对应的SQL Server虚拟化环境. 现在,作为DBA,您可能没有访问权限来创建用于SQL Server的新虚拟机.这些操作可以交给您的VM管理员,他们将为您部署合适的VM环境. 以下详细信息适用于在Windows S

Sql Server来龙去脉系列之四 数据库和文件

在讨论数据库之前我们先要明白一个问题:什么是数据库? 数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多的数据库.一个数据库实例最多能创建32767个数据库,但是按照实际情况,一般设计是不会达到这个限制值. 为了更明显地说明数据库,数据库包含了以下属性和功能: *. 它是很多对象的集合,比如表.视图.存储过程.约束.对象集合的最大值是2(31) - 1(超过2百亿).一般对象的数量在几百至一万. *. 它维持拥有的用

Sql Server来龙去脉系列之三 查询过程跟踪

我们在读写数据库文件时,当文件被读.写或者出现错误时,这些过程活动都会触发一些运行时事件.从一个用户角度来看,有些时候会关注这些事件,特别是我们调试.审核.服务维护.例如,当数据库错误出现.列数据被更新.CPU占用过高等,跟踪这些状态是非常有用地. 本章节覆盖了事件系统的关键区域:触发器.事件通知器.改变跟踪.SQL跟踪.扩展事件等.这些事件都有一个相似目的:响应或者记录发生的事件.但每一中事件的工作方式又不一样. 基础:触发器和事件通知器 触发器非常多,Data Manipulation La

Sql Server来龙去脉系列之一 目录篇

不要做一个只懂数据库查询的程序猿,学习数据库我们不要只知其一不知其二.之前看了下<Microsoft SQL Server 2008 Internals>,才知道数据库是怎么样的架构以及数据库使用了哪些网络传输协议,受益不浅值得自己花时间继续去深入研究,也推荐这本书给需要学习数据库的同学看.另外,给大家分享下这两天学习的一些心得:学.NET就得好好看msdn. 之前在博客园看了很多介绍ASP.NET在IIS的运行管道的文章,但我自己觉得还是msdn描述的最直接 (https://msdn.mi

Sql Server来龙去脉系列 必须知道的权限控制基础篇

题外话:最近看到各种吐槽.NET怎么落寞..NET怎么不行了..NET工资低的帖子.我也吐槽一句:一个程序猿的自身价值不是由他选择了哪一门技术来决定,而是由他自身能创造出什么价值来决定. 在进入本篇内容之前,这里有几个问题: 1.一般程序猿都知道怎样创建.修改.登录账号,但知不知道登陆账号存储在哪个表或者视图? 2.数据库中其实存在登录账号和用户两个概念,你能解释清楚这两个概念吗? 3.对于一个登录账号,我们可以为他设置哪些权限? 4.你清不清楚数据库信息存储在哪些表或试图? 5.我们可以给登录