技术开发 频道

SQL Server2005之SMO实战



二、使用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
相关文章