返回首页

{A}
{S0}简介
本文介绍如何创建一个自定义的组合框控件列出连接到网络,并在本地运行的所有服务器的完全限定的SQL Server实例名称。背景
本文使用詹姆斯柯伦的文章,{A2}文章中的代码。
我写的本地计算机上运行的实例名称填充组合框控件的代码,并使用Visual Studio 2008创建一个复合控件。我的工作,多个版本的项目文件存储在数据库中使用SQL Server的源代码控制项目。数据库可以位于同一台机器上我的源代码控制程序,或它可以通过网络连接。所以,我需要一个上市的SQL Server实例的名称,发现在本地和通过网络的方式。起初,我试图使用的NetServerEnum Windows API函数来检索所有的SQL服务器列表。这种方法是极其缓慢的,它没有给我完全合格的实例名称。
自定义控件的Load事件中调用的Populate_ComboBox()方法,其目的是完全一样顾名思义的。

Private Sub SQLExpressCombo_Load(ByVal sender As System.Object, _

            ByVal e As System.EventArgs) Handles MyBase.Load



    'set default size.

    ComboBox1.Height = Me.Size.Height + 5



    Populate_ComboBox()



End Sub

如果SQL Server是在本地运行,然后组合框填充了所有的本地实例名称的第一个。本地实例的名称检索,从注册表项HKEY_LOCAL_MACHINE \ SOFTWARE \ MICROSOFT \ Microsoft SQL Server的\实例名\ SQL \。此注册表项包含所有实例名称的名称。此代码只在SQL Server 2005 Express的测试。我无法测试它在MSDE 2000,因为MSDE 2000是与Windows XP Service Pack 3中不兼容。
下半年这种方法检索在网络上找到任何实例名称。 Get_Network_Servers返回util.SqlServerInfo对象的数组,其中每个包含每个实例运行在网络上的信息。
我还要提及与否,组合框的填充与本地的实例名称和实例名称在网络上找到的mShow_Servers变量的值决定。您可以通过设置自定义控制的服务器属性,筛选组合框下拉列表中显示的是什么。{C}
Get_Local_Servers功能声明HKEY_LOCAL_MACHINE注册表项对象,然后使用这个对象来检索一个子键。 Sub_Key代表"HKEY_LOCAL_MACHINE \ SOFTWARE \ MICROSOFT \ Microsoft SQL Server的\实例名\ SQL \ quot;,这是在那里你会发现本地计算机的本地实例名称。一旦你的子键,你只需要调用GetValueNames()方法来检索包含本地计算机上的实例名称的字符串数组。
''' Returns the Instance names for all local servers.

Private Function Get_Local_Servers() As String()



    'Only add local instance names if sqlservr process is running.

    If Is_Local_SqlServer_Running() Then



        Try



            Dim HKEY_LOCAL_MACHINE As Microsoft.Win32.RegistryKey = _

                My.Computer.Registry.LocalMachine()

            Dim Sub_Key As Microsoft.Win32.RegistryKey = _



                HKEY_LOCAL_MACHINE.OpenSubKey("Software\" & _ 

                "Microsoft\Microsoft SQL Server\Instance Names\SQL\", False)



            If Not IsNothing(Sub_Key) Then



                If Sub_Key.ValueCount > 0 Then



                    'Return all instance names from registry.

                    Return Sub_Key.GetValueNames()



                End If



            End If



        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try



    End If



    Return Nothing



End Function

只剩讨论是从原来的组合框控件的属性和事件是如何进行。
注意BackColorChanged事件处理程序声明如何使用阴影关键字。阴影关键字指定属性或程序将重新申报现有财产或具有相同的名称的程序。因此,在基类中BackColorChanged的事件处理程序将被替换上述声明。当ComboBox1的BackColorChanged事件处理程序被触发,我们提高SQL组合框控件的事件处理程序。
Public Shadows Event BackColorChanged(ByVal sender As System.Object, _

                     ByVal e As System.EventArgs)

     

Private Sub ComboBox1_BackColorChanged(ByVal sender As System.Object, _

                    ByVal e As System.EventArgs) _

                    Handles ComboBox1.BackColorChanged

    RaiseEvent BackColorChanged(sender, e)

End Sub

组合框控件SelectedIndexChanged事件处理程序不需要阴影关键字,这是因为在基类中没有这样的事件处理程序。除此之外,宣言的最后一个例子是相同的。
Public Event SelectedIndexChanged(ByVal sender As System.Object, _

                                  ByVal e As System.EventArgs)

     

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, _

    ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged



    RaiseEvent SelectedIndexChanged(sender, e)



End Sub

此外,自定义控件的Text属性的阴影在基类中的Text属性。
Public Shadows Property Text() As String

   Get

       Return ComboBox1.Text

   End Get

   Set(ByVal value As String)

       ComboBox1.Text = value

   End Set

End Property
使用代码
使用SQL组合框控件,只需编译代码,并添加SQL_Express_DropListBox.dll到您的Visual Studio工具箱。如果您使用防火墙,您将需要配置为1434端口的UDP数据包,否则,你不会看到本地网络上的任何服务器。组合框控件刷新计时器,这是Enable_Timer属性设置为True启用。兴趣点
替代方法用于获取本地实例的名称会被搜索下quot; HKEY_LOCAL_MACHINE \ SOFTWARE \ MICROSOFT \ Microsoft SQL Server的\"; quot开始使用一个名称,所有的键; MSSQL.quot;每个实例名称将编号:MSSQL.1,MSSQL.2 ...依此类推。然后,您可以读取其中每个键的值来获得实例名称。
SQL Server 2000和MSDE 2000的本地网络上运行的服务器将显示在下拉列表框控件,但不会显示出来,如果​​他们是在本地运行。这是因为微软改变了注册表中的数据为SQL Server 2005的存储方式。我本来计划写的代码,其中包括本地MSDE 2000服务器,但MSDE 2000是与Windows XP Service Pack 3中不兼容。我不能,我的工作站上运行的MSDE 2000后我安装了Service Pack 3。

回答

评论会员:hoangthu1974 时间:2011/12/27
此控件无法加载SQL Server 2000的
评论会员:。清莱沙希德 时间:2011/12/27
这将是非常有用的控制...

R @!沙希德