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

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

SMO简介

SMO是英文SQL Server Management Objects的缩写,意思是SQL Server管理对象系列,包含了一些列的命名空间(namespace)、动态链接库(dll)和类(class)。这些类偏重于SQL Server的管理,并且在底层是通过SQL Server数据库提供程序(System.Data.SqlClient)下的类来与SQL Server来进行交互的。可以通过编程的方式利用SMO来管理SQL Server7.0以上的版本(SQL Server 7.0/2000/2005/2008),如果低于以上版本的SQL Server则无法利用SMO来管理(除了历史原因遗留的系统,在现在的开发中那些不受支持的SQL Server算是和Windows95一样的古董了)。同时,要使用SMO的话,必须安装SQL Server Native Client,一般情况下当我们安装.Net Framework2.0以上版本或者SQL Server2005以上版本时就会自动安装上了。

在32位系统下如果安装的是SQL Server2005并且没有更改安装路径,则SMO程序集的路径是:C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies,相应的,如果安装的是SQL Server2008,则SMO程序集的路径就是C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies,如果是在64位系统下安装,则根据安装的SQL Server的版本来判断是在Program Files (x86)还是在Program Files下面的对应目录下。

在SMO中有如下命名空间:Microsoft.SqlServer.Management.Common、 Microsoft.SqlServer.Management.Nmo、Microsoft.SqlServer.Management.Smo、 Microsoft.SqlServer.Management.Smo.Agent、 Microsoft.SqlServer.Management.Smo.Broker、 Microsoft.SqlServer.Management.Smo.Mail、 Microsoft.SqlServer.Management.Smo.RegisteredServers、 Microsoft.SqlServer.Management.Smo.Wmi、 Microsoft.SqlServer.Management.Trace,关于这些命名空间在哪个dll中以及该命名空间下有哪些类,大家可以查阅 SQL Server的帮助文章或者查阅在线MSDN,例如查看命名空间下的类可以浏览:http://msdn.microsoft.com/zh-cn/library/microsoft.sqlserver.management.smo(v=sql.100)

SMO体系架构

我们知道在SQL Server体系中处于顶层是SQL Server实例,每个实例会有多个数据库,每个数据库会有多个表、存储过程、函数、登录账号等,每个表会有列、索引、主键等信息,每个列会有列名、默认 值、字段大小等信息,在SMO中有与之相对应的一套类体系结构。

在DatabaseCollection中每个元素都是一个Database类的实例,分别对应数据实例中的一个数据库;在 TableCollection中每个元素都是一个Table的实例,分别对应数据库中的一个表;在ColumnCollection中每个元素都是一个 Column类的实例,分别对应表中的每一列,以上这些类都位于Microsoft.SqlServer.Management.Smo命名空间下,在 Microsoft.SqlServer.Smo.dll这个dll中。

当然,在Microsoft.SqlServer.Management.Smo命名空间中的类远不止上面提到的这些,上面的表格只是做了一个简单的类比。

SMO用法示例

上面的文章只是做了一个简单的介绍,也许通过上面枯燥的介绍大家没什么印象,下面通过一段简单的代码来简单演示一下用法,首先要添加响应的引用。在VS2008中可以直接通过下面的方式添加引用:

但是在VS2010中就没有这么方便了,它使用了过滤属性(而且还无法禁用掉或者进行设置),使得无法添加这些程序集,如下图:

我看到有人在Stack Overflow提了和我疑惑相同的问题,别人给了一个答案就是在VS2010中安装Muse.VSExtensions来解决,安装地址:http://visualstudiogallery.msdn.microsoft.com/36a6eb45-a7b1-47c3-9e85-09f0aef6e879/,我尝试了一下不是很理想,不过Muse.VSExtensions还提供了其它的功能(比如移除未使用的程序集)还是不错的。

注意在编译下面的代码之前需要添加对microsoft.sqlserver.connectioninfo.dll和microsoft.sqlserver.smo.dll的引用。

代码如下:

  1. using System;
  2. using Microsoft.SqlServer.Management.Common;//需添加microsoft.sqlserver.connectioninfo.dll的引用
  3. using Microsoft.SqlServer.Management.Smo;//需添加microsoft.sqlserver.smo.dll的引用
  4. namespace SSISStudy
  5. {
  6. /// <summary>
  7. /// SQL Server编程些列文章(1):SMO介绍的配套代码
  8. /// 作者:周公
  9. /// 创建日期:2012-05-17
  10. /// 博客地址:http://blog.csdn.net/zhoufoxcn http://zhoufoxcn.blog.51cto.com
  11. /// 新浪微博地址:http://weibo.com/zhoufoxcn
  12. /// </summary>
  13. class SMODemo01
  14. {
  15. /// <summary>
  16. /// 显示数据库的概要情况
  17. /// </summary>
  18. public static void ShowServerInfo()
  19. {
  20. //创建ServerConnection的实例
  21. ServerConnection connection = new ServerConnection();
  22. //指定连接字符串
  23. connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;";
  24. //实例化Server
  25. Server server = new Server(connection);
  26. Console.WriteLine("ActiveDirectory:{0}", server.ActiveDirectory);
  27. Console.WriteLine("InstanceName:{0}",server.InstanceName);
  28. //列出当前SQL Server实例中的登录用户
  29. foreach (Login login in server.Logins)
  30. {
  31. Console.WriteLine("Name:{0},CreateDate:{1},DefaultDatabase:{2}", login.Name, login.CreateDate, login.DefaultDatabase);
  32. }
  33. //通过索引方式找到master数据库
  34. Database db = server.Databases["master"];
  35. Console.WriteLine("Database:{0}", db.Name);
  36. Console.WriteLine("CreateDate:{0},Dbo:{1}", db.CreateDate, db.Owner);
  37. Console.WriteLine("DataSpaceUsage:{0},SpaceAvailable:{1}", db.DataSpaceUsage, db.SpaceAvailable);
  38. Console.WriteLine("PrimaryFilePath:{0}", db.PrimaryFilePath);
  39. //列出master数据库下每个表的概要信息
  40. foreach (Table table in db.Tables)
  41. {
  42. Console.WriteLine("\tTable:{0},DataSpaceUsed:{1},CreateDate:{2}", table.Name, table.DataSpaceUsed, table.CreateDate);
  43. //urnCollection.Add(table.Urn);
  44. //列出每个表中每个列的概要信息
  45. foreach (Column column in table.Columns)
  46. {
  47. Console.WriteLine("\t\tColumn:{0},DataType:{1},Nullable:{2}", column.Name, column.DataType, column.Nullable);
  48. }
  49. }
  50. //列出master数据库中的角色信息
  51. foreach(DatabaseRole dbRole in db.Roles)
  52. {
  53. Console.WriteLine("DB Role {0} Created at {1}", dbRole.Name, dbRole.CreateDate);
  54. }
  55. Console.ReadLine();
  56. }
  57. }
  58. }

程序的执行效果如下:

通过上面的代码可以获取很多有关数据库的信息,而在代码中我们没有写一行SQL语句,而在之前周公曾写过一篇博客《在.NET中根据SQL Server系统表获取数据库管理信息》,在其中为了查找这些信息周公是查了很多资料才知道SQL语句的写法,使用SMO之后连SQL语句都免了,可见利用SMO来管理数据库的方便性。在后续的篇幅中周公将讲述如何利用SMO来获取SQL Server中数据库的创建语句及如何利用SMO来创建Job。

时间: 2024-11-03 05:42:23

(转) SQL Server编程系列(1):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编程系列(2):SMO常用对象的有关操作

在上一篇讲述了SMO的一些基本概念,实际上SMO体系结构远不止周公在上一篇中讲述的那么简单,下图是MSDN上给出的一个完整的结构图: 上图是一个完整的涉及到各种关系的结构图.不过它们之间的层次结构关系周公已经在上一篇做了简单概述. 在本篇中周公还是在上一篇的基础上再做稍微深入一点的介绍,在本篇中主要讲述如何获取数据库常见对象信息,并且如何利用SMO来进行一些日常操 作:如创建Login,创建数据库.备份数据库和还原数据库.执行上面这些操作的SQL语句也许我们已经写过,下面我们来看看利用SMO来操

[转]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来龙去脉系列之一 目录篇

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

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

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

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

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

SQL Server和Oracle数据库索引介绍

SQL Server和Oracle数据库索引介绍 1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行. 表或视图可以包含以下类型的索引: 聚集索引 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行.索引定义中包含聚集索引列.每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序. 只有当表包含聚集索引