SQL Server2005之SMO实战

http://tech.it168.com/msoft/2007-10-28/200710281939625.shtml

SQL Server2005之SMO实战

[ 收藏此页] [ 打印]


源代码下载

【IT168 专稿】

    在SQL Server2005以前的版本中,SQL分布式管理对象(SQL-DMO)为我们提供了非常有效的方法来通过编程的方式管理SQL Server。SQL-DMO支持基于COM的接口,开发人员可以通过这个接口来发现和操作SQL Server对象。而SQL Server2005在这方面做了更大的改进,它提供了一种新的管理框架,叫做SQL Server管理对象(简称为SMO),这套组件具有更强大的管理能力,而且它被建立在.Net Framework2.0之上。当然,我们仍然可以使用SQL-DMO来管理SQL Server2005,但SMO为我们提供了更多的功能,也支持很多SQL Server2005的新特性,它的性能也比SQL-DMO更优化。

微软将SMO定义为“为可编程管理微软SQL Server而设计的对象”。SMO给了开发人员更全面地管理SQL Server的各种元素的能力,如表、列、索引、存储过程、触发器、Service Broker、快照数据库、备份和恢复、文件和文件组等。本文为了介绍SMO的使用,讨论了SMI的一些主要的特性。本文首先讨论了一些和SMO相关的编程主题,然后分析了一个SMO的应用程序例子。在这个例子中将演示如何使用SMO来引用 SQL对象和它们的属性,以及如何为它们产生T-SQL脚本。

一、SMO基础
SMO由.NET Framework2.0写成。所以我们必须使用Visual Studio2005或其后继版本中使用SMO。我们可以在Windows2003、Windows XP、Windows2000和Windows NT(SP5及以上版本)。别外,我们可以使用SMO连接SQL Server7、SQL Server2000和Sql Server2005数据库,但SMO并不支持更底版本的数据库,如sql server6.5。虽然SMO可以降级使用,但很明显,如果使用较低级的数据库,它的更多的特性就无法使用了。要使用SMO,我们需要如下的.NET库:
 
Microsoft.SqlServer.ConnectionInfo
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SmoEnum
Microsoft.SqlServer.SqlEnum

    如果我们没有在Visual Studio的标准.NET引用列表中看到,我们可以在C:/Program Files/Microsoft SQL Server/90/SDK/Assemblies目录中找到这些库。如果我们没有这些组件,可以使用SQL Server客户端利用SQL Server2005的任何版本来安装它们。

    在每个引用SMO对象的代码文件中,我们都要使用imports(VB.NET)来导入以下的命名空间:

Imports Microsoft.SqlServer.Management
 Imports Microsoft.SqlServer.Management.Smo
 Imports Microsoft.SqlServer.Management.Common
 
为了增强可读性,最好同时引用Microsoft.SqlServer.Management.Smo 和 the Microsoft.SqlServer.Management。这主要是因此这们包含了一些名子相同的类,这些类可能会和定义在Windows Forms应用程序中的其他类产生歧义。在这种情况下,我们可以使用SMO命名空间作为前缀以消除歧义,如Dim objView as Smo.View。
二、使用SMO连接SQL Server2005

SMO提供了非常具有弹性的连接SQL Server的方式,它可以连接本地或远程服务器,并可以使用SQL或Windows验证两种登录方式。最简单的一种连接方式用是使用Windows验证登录到本地SQL Server的默认实例。为了达到这个目的,我们可以使用SMO的Server类的默认构造方法,代码如下:
     
     
Imports Microsoft.SqlServer.Management Imports Microsoft.SqlServer.Management.Smo Imports Microsoft.SqlServer.Management.Common Dim objServer as Server Dim objSvrConn as ServerConnection '**************************************************** ' establish connection to default ' instance of local SQL Server using ' Windows authentication ' **************************************************** objServer = New Server()
如果使用Server类使用Windows验证来连接一个指定的SQL Server的一个实例,无论这个服务器是本地的,还是远程的,都可以使用Server类构造方法来接收实例名,代码如下:
'****************************************************
'   establish connection to remote
'   instance of SQL Server using
'   Windows authentication
'****************************************************
objServer = New Server("ServerName/InstanceName")
 
对于如有类型的连接,如使用SQL验证方式,或使用服务器名、用户名和密码进行连接的ServerConnection对象都可以通过Server的构造方法中传入,代码如下:

      
      
'**************************************************** ' establish connection to SQL ' Server using SQL authentication ' using the ServerConnection class ' **************************************************** objSvrConn = new ServerConnection() objSvrConn.ServerInstance = "ServerName/InstanceName" objSvrConn.Login = "SMOSampleUser" objSvrConn.Password = "SMOSamplePassword" objServer = New Server(objSvrConn) For Each objDB as Database in objServer.Databases Debug.WriteLine(objDB.Name) Next
读者在使用SMO连接数据库时应注意,为了更有效地改善SMO应用程序的性能。连接到SQL Server时并不马上建立连接,直到我们第一次使用这个连接时才真正连接到SQL Server数据库.。这就意味着在第一次使用连接之前,无论我们使用的连接参数是否正确,都不会得到任何的异常。如上面的代码在建立Server对象时,如果连接参数错误,并不会抛出任何异常,直接调用objServer.Databases时才会抛出异常。
 
    在有些情况下,我们的SMO应用程序需要向用户提供一些可用的SQL Server实例列表。这就需要使用SMO提供的方法SmoApplication.EnumAvailableSqlServers来实现,这个方法返回了它能在网络上检测到的所有可用的SQL Server实例列表。这个方法有三个重载形式,第一个重载形式没有参数,它将扫描网络上所有可用的SQL Server实例。第二个重载形式有一个Boolean类型参数,如果这个参数为true,只得到本机的SQL Server实例,如果为false,则只得到网络上的SQL Server实例。第三个重载形式可以指定得到哪一台机器上的SQL Sever实例。机器名可通过方法参数指定。这个方法将数据以DataTable形式返回。下面的代码将演示了EnumAvailableSQLServers方法的第二种重载形式,并设置了参数为false(只得到网络上可用的SQL Server实例)。

       
       
Imports Microsoft.SqlServer.Management Imports Microsoft.SqlServer.Management.Smo Imports Microsoft.SqlServer.Management.Common Dim dtServers as DataTable Dim strServer As String '**************************************************** ' build a list of all SQL Server instances ' on the network ' **************************************************** objServers = SmoApplication.EnumAvailableSqlServers(False ) For Each objRow as DataRow in objServers.Rows strServer = CStr(objRow("Server" )) If Not TypeOf objRow("Instance") Is DBNull _ AndAlso CStr(objRow("Instance")).Length > 0 Then strServer += "/" & CStr(objRow("Instance" )) End If Debug.WriteLine( "SQL Server: " & strServer) Next
在上面的循环开始部分,要注意返回的服务器列表包括一个服务器名和一个实例名。当将一个服务名传递给Server类的构造方法时,同时还要传递一个合适的实例名。在上面代码的循环中演示了如何从DataTable中取得相应的服务器名和实例名。

    使用EnumAvailableSqlServers方法也不一定可以得到网络中的所有可用的SQL Server实例。其中最主要的原因就是安全限制。现在安全问题已经成为大多数组织非常关心的问题,其中包括微软,因此,大多数PC桌面系统都有防火墙来阻止网络广播探测。.如果在我们的网络中有类似的防火墙或网络中的广播探测由于其他原因被阻止。那么EnumAvailableSqlServers将无法得到很全的可用SQL Server实例列表。如果限制非常严格,也许我们只能得到本机的SQL Server实例列表。

   
响应延迟可能是限制EnumAvailableSqlServers方法得到足够的SQL Server实例的另一个原因。在这种情况下,我们可以通过多次调用EnumAvailableSqlServers来发现更多在响应较慢机器上的SQL Server实例。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值