最近在项目中用到了有关sqlserver管理任务方面的编程实现,有了一些自己的心得体会,想在此跟大家分享一下,在工作中用到了smo/sqlclr/ssis等方面的知识,在国内
最近在项目中用到了有关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,例如查看命名空间下的类可以浏览:(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来解决,安装地址:,我尝试了一下不是很理想,不过muse.vsextensions还提供了其它的功能(比如移除未使用的程序集)还是不错的。
注意在编译下面的代码之前需要添加对microsoft.sqlserver.connectioninfo.dll和microsoft.sqlserver.smo.dll的引用。
代码如下:
程序的执行效果如下:
通过上面的代码可以获取很多有关数据库的信息,而在代码中我们没有写一行sql语句,而在之前周公曾写过一篇博客《在.net中根据sql server系统表获取数据库管理信息》,在其中为了查找这些信息周公是查了很多资料才知道sql语句的写法,使用smo之后连sql语句都免了,美国服务器,可见利用smo来管理数据库的方便性。在后续的篇幅中周公将讲述如何利用smo来获取sql server中数据库的创建语句及如何利用smo来创建job。
周公
2012-05-17
本文出自 “周公(周金桥)的专栏” 博客,请务必保留此出处
