最近在项目中用到了有关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,例如查看命名空间下的类可以浏览:
       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来解决,我尝试了一下不是很理想,不过Muse.VSExtensions还提供了其它的功能(比如移除未使用的程序集)还是不错的。
       注意在编译下面的代码之前需要添加对microsoft.sqlserver.connectioninfo.dll和microsoft.sqlserver.smo.dll的引用。
       代码如下:

  • using System;
  • using Microsoft.SqlServer.Management.Common;//需添加microsoft.sqlserver.connectioninfo.dll的引用
  • using Microsoft.SqlServer.Management.Smo;//需添加microsoft.sqlserver.smo.dll的引用
  • namespace SSISStudy
  • {
  • /// <summary>
  • /// SQL Server编程些列文章(1):SMO介绍的配套代码
  • /// 作者:周公
  • /// 创建日期:2012-05-17
  • /// 博客地址:http://blog.csdn.net/zhoufoxcn http://zhoufoxcn.blog.51cto.com
  • /// 新浪微博地址:http://weibo.com/zhoufoxcn
  • /// </summary>
  • class SMODemo01
  • {
  • /// <summary>
  • /// 显示数据库的概要情况
  • /// </summary>
  • public static void ShowServerInfo()
  • {
  • //创建ServerConnection的实例
  • ServerConnection connection = new ServerConnection();
  • //指定连接字符串
  • connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;";
  • //实例化Server
  • Server server = new Server(connection);
  • Console.WriteLine("ActiveDirectory:{0}", server.ActiveDirectory);
  • Console.WriteLine("InstanceName:{0}",server.InstanceName);
  • //列出当前SQL Server实例中的登录用户
  • foreach (Login login in server.Logins)
  • {
  • Console.WriteLine("Name:{0},CreateDate:{1},DefaultDatabase:{2}", login.Name, login.CreateDate, login.DefaultDatabase);
  • }
  • //通过索引方式找到master数据库
  • Database db = server.Databases["master"];
  • Console.WriteLine("Database:{0}", db.Name);
  • Console.WriteLine("CreateDate:{0},Dbo:{1}", db.CreateDate, db.Owner);
  • Console.WriteLine("DataSpaceUsage:{0},SpaceAvailable:{1}", db.DataSpaceUsage, db.SpaceAvailable);
  • Console.WriteLine("PrimaryFilePath:{0}", db.PrimaryFilePath);
  • //列出master数据库下每个表的概要信息
  • foreach (Table table in db.Tables)
  • {
  • Console.WriteLine("\tTable:{0},DataSpaceUsed:{1},CreateDate:{2}", table.Name, table.DataSpaceUsed, table.CreateDate);
  • //urnCollection.Add(table.Urn);
  • //列出每个表中每个列的概要信息
  • foreach (Column column in table.Columns)
  • {
  • Console.WriteLine("\t\tColumn:{0},DataType:{1},Nullable:{2}", column.Name, column.DataType, column.Nullable);
  • }
  • }
  • //列出master数据库中的角色信息
  • foreach(DatabaseRole dbRole in db.Roles)
  • {
  • Console.WriteLine("DB Role {0} Created at {1}", dbRole.Name, dbRole.CreateDate);
  • }
  • Console.ReadLine();
  • }
  • }
  • }

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

SMO是英文SQL Server Management Objects的缩写(上一篇文章的补充)的更多相关文章

  1. SQL Server R2 2008中的SQL Server Management Studio 阻止保存要求重新创建表的更改问题的设置方法

    在2008中会加入阻止保存要求重新创建表的更改这个选项.症状表现为修改表结构的时候会"阻止"你. SQL Server 2008“阻止保存要求重新创建表的更改”的错误的解决方案是本 ...

  2. 在英文Windows操作系统上使用SQL Server Management Studio(SSMS)导入Excel 97-2003文件时报错:Failure creating file

    今天在公司服务器上使用SQL Server Management Studio(SSMS)导入Excel 97-2003文件(.xls)时报错: Failure creating file. (Mic ...

  3. SQL Server Management Studio(SSMS)的使用与配置整理

    目录 目录 SQL Server Management Studio的使用与配置 1 设置SSMS显示行号 2 添加注释与取消注释的快捷键 3 新建查询的快捷键 4 开启sql语句TIME与IO的统计 ...

  4. SQL Server Management Studio自定义快捷键

    SQL Server Management Studio支持自定义快捷键:工具->选项->键盘: 其中,Alt+F1.Ctrl+1.Ctrl+2是系统预定义的快捷键. 双击表名(或按Ctr ...

  5. SQL Server Management Studio --- SSMS语言更换

    问题描述 在安装了En版后,想更换为中文版,但换了中文安装源还是英文. 解决方法 运行 SQL Server Management Studio 通过菜单选择你想要使用的语言: 中文版:"工 ...

  6. SQL Server Management Studio 无法修改表,超时时间已到 在操作完成之前超时时

    在修改表时,保存的时候显示:无法修改表,超时时间已到 在操作完成之前超时时间已过或服务器未响应 这是执行时间设置过短的原因,可以修改一下设置便能把执行时间加长,以便有足够的时间执行完修改动作. 在 S ...

  7. 禁用SQL Server Management Studio的IntelliSense

    禁用SQL Server Management Studio的IntelliSense 本文版权归作者所有,未经作者同意不得转载.

  8. Sql Server系列:Microsoft SQL Server Management Studio模板资源管理器

    模板资源管理器是Microsoft SQL Server Management Studio的一个组件,可以用来SQL代码模板,使用模板提供的代码,省去每次都要输入基本代码的工作. 使用模板资源管理器 ...

  9. 如何清除SQL Server Management Studio的最近服务器列表

    SQL Server Management Studio (SSMS) 的"连接到服务器"对话框会记录用户所有访问过的服务器名称,这个功能对于经常连接多个数据库的人来说确实挺方便的 ...

随机推荐

  1. 剑指offer--28.栈的压入、弹出序列

    时间限制:1秒 空间限制:32768K 热度指数:300132 本题知识点: 栈 算法知识视频讲解 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假 ...

  2. 【tensorflow:Google】四、深层神经网络

    一.深度学习与深层神经网络 1.线性模型局限性 线性模型无论多少层,表达能力是一致的.可以通过激活函数实现非线性. 2.多层网络可以解决异或运算 二.损失函数定义 1.经典损失函数: 分类问题: 二分 ...

  3. HAWQ取代传统数仓实践(十五)——事实表技术之无事实的事实表

    一.无事实事实表简介 在多维数据仓库建模中,有一种事实表叫做"无事实的事实表".普通事实表中,通常会保存若干维度外键和多个数字型度量,度量是事实表的关键所在.然而在无事实的事实表中 ...

  4. 【转载】取得系统中网卡MAC地址的三种方法

    From:http://blog.csdn.net/zhangting1987/article/details/2732135 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址 ...

  5. rebar自定义template

    在开发过程中rebar自带模板建立项目,或多或少不能满足自己的开发需求.本人又是那种懒人,所以就要想办法偷懒.查看了priv模板 打造适合自己的项目模板.下面我简单的介绍整个模板的打造过程. 准备过程 ...

  6. IDEA Intellij中vim插件使用小技巧

    在 IDEA Intellij小技巧和插件 一文中简单介绍了一下IdeaVim插件.在这里详细总结一下这个插件在日常编程中的一些常用小技巧.供有兴趣使用这个插件,但对Vim还不十分熟悉的朋友参考.当然 ...

  7. C#的基类都有哪些方法

    之前面试有被问到这个问题,平时没去注意,回答的不好,在此整理一下. 在C#中,个方法,重载的方法没有算进来: 构造函数 ToString()函数 GetHashCode函数 Equals函数 Refe ...

  8. Yii CDbCriteria类中方法

    $criteria = new CDbCriteria; //select $criteria->select = '*';//默认* $criteria->select = 'id,na ...

  9. 关于 webpack-dev-server 热更新出现重复的问题

    关于 webpack-dev-server 热更新出现重复的问题 webpack-dev-server 在前端开发时很方便,可以热更新,只需要配置 webpack.config.js 即可. 但是昨天 ...

  10. (转)android adb pull and push

    adb命令下pull的作用是从手机端向电脑端拷文件. 命令:adb pull /sdcard/**.txt   D:\                          说明:将手机卡中的某个文本文件 ...