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

简介: 原文: SQL Server编程系列(1):SMO介绍 续篇:SQL Server编程系列(2):SMO常用对象的有关操作 最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己的心得体会,想在此跟大家分享一下,在工作中用到了S...
原文: SQL Server编程系列(1):SMO介绍

续篇:SQL Server编程系列(2):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的引用。
代码如下:
	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。
周公
2012-05-17

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

目录
相关文章
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
385 16
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL 数据挖掘 Python
数据分析编程:SQL,Python or SPL?
数据分析编程用什么,SQL、python or SPL?话不多说,直接上代码,对比明显,明眼人一看就明了:本案例涵盖五个数据分析任务:1) 计算用户会话次数;2) 球员连续得分分析;3) 连续三天活跃用户数统计;4) 新用户次日留存率计算;5) 股价涨跌幅分析。每个任务基于相应数据表进行处理和计算。
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
707 13
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
506 9
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
332 6
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
1352 3
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
1352 1
|
SQL 存储 安全
数据库数据恢复—SQL Server数据库出现逻辑错误的数据恢复案例
SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生成了一个.ndf的文件并且将数据库路径指向E盘继续使用。数据库继续运行一段时间后出现故障并报错,连接失效,SqlServer数据库无法附加查询。管理员多次尝试恢复数据库数据但是没有成功。
|
SQL 存储 关系型数据库
关系型数据库SQL Server学习
【7月更文挑战第4天】
290 2