none
Mostrar Instancias SQL Server Local RRS feed

  • Pregunta

  • Estimados,

    Mi pregunta es como mostrar las instancias de SQL Server Local, no en Red, pro al mostrar el nombre del Servidor con su instancia, que el nombre lo muestre como ejemplo: ".\SQLExpress", buscando por Internet, encontré el siguiente código, pero es demoroso

    Private Sub cmbServidores_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.Click
    
            Me.Cursor = Cursors.WaitCursor
               If tablaServidores.Rows.Count = 0 Then
                tablaServidores = servidores.GetDataSources()
    
                Dim listaServidores As List(Of String) = New List(Of String)
    
                For Each rowServidor As DataRow In tablaServidores.Rows
    
                     If String.IsNullOrEmpty(rowServidor("InstanceName").ToString()) Then
                        listaServidores.Add(rowServidor("ServerName").ToString())
                    Else
                        listaServidores.Add(rowServidor("ServerName") & "\" & rowServidor("InstanceName"))
                    End If
                Next
    
                ComboBox1.DataSource = listaServidores
            End If
            Me.Cursor = Cursors.Arrow
    
        End Sub


    Agradezco su ayuda...


    martes, 4 de julio de 2017 18:06

Respuestas

  • "CristianVI" preguntó:

    > Mi pregunta es como mostrar las instancias de SQL Server Local, no en Red, ...
    > buscando por Internet, encontré el siguiente código, pero es demoroso
    >
    >  tablaServidores = servidores.GetDataSources()

    Hola:

    Si 'tablaServidores' es un objeto del tipo System.Data.Sql.SqlDataSourceEnumerator, no me extraña que se demore en su ejecución, y bastante, el método GetDataSources, el cual hay que utilizarlo con precaución.

    Como escribes que no te interesa conocer las instancias de SQL Server existentes en red, hay una solución muy fácil y efectiva para salir del paso, que consiste en saber leer las correspondientes claves del registro de Windows, tal y como muestra la siguiente función:

        ''' <summary>
        ''' Devuelve un array con los nombres de las instancias locales instaladas de SQL Server.
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Shared Function GetInstalledInstancesSqlServer() As String()
    
            ' Inicializar las matrices a la vez que se declaran.
            Dim instances64Bit As String() = New String() {}
            Dim instances32Bit As String() = New String() {}
    
            ' Instancias instaladas de SQL Server.
            Dim keyName As String = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server"
            Dim value As Object = Microsoft.Win32.Registry.GetValue(keyName, "InstalledInstances", New String() {})
            If (Not value Is Nothing) Then
                ' NO ELIMINAR la verificación Nothing, porque si no existe la clave éste será
                ' el valor que tenga la variable 'value'.
                instances64Bit = DirectCast(value, String())
            End If
    
            ' Si el sistema operativo es de 64 bits, obtenemos las posibles instancias
            ' instaladas de SQL Server de 32 bits existentes en el subsistema WOW64.
            keyName = "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server"
            value = Microsoft.Win32.Registry.GetValue(keyName, "InstalledInstances", New String() {})
            If (Not value Is Nothing) Then
                ' NO ELIMINAR la verificación Nothing, porque si no existe la clave éste será
                ' el valor que tenga la variable 'value'.
                instances32Bit = DirectCast(value, String())
            End If
    
            ' Nombre del equipo
            Dim cn As String = Environment.GetEnvironmentVariable("COMPUTERNAME")
    
            Dim localInstanceNames As New List(Of String)(instances64Bit)
            localInstanceNames = localInstanceNames.Union(instances32Bit).ToList()
    
            For n As Int32 = 0 To localInstanceNames.Count - 1
                Dim name As String = localInstanceNames(n)
                If (name.Equals("MSSQLSERVER", StringComparison.OrdinalIgnoreCase)) Then
                    localInstanceNames(n) = cn
                Else
                    localInstanceNames(n) = IO.Path.Combine(cn, name)
                End If
            Next
    
            Return localInstanceNames.ToArray()
    
        End Function

    Por ejemplo, para mostrar en un control ComboBox los nombres de las instancias locales de SQL Server instaladas, simplemente ejecutarías lo siguiente:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ComboBox1.Items.Clear()
    
            Try
                Dim instances As String() = GetInstalledInstancesSqlServer()
                If (instances Is Nothing) Then
                    MessageBox.Show("No existen instancias instaladas de SQL Server.")
                    Return
                End If
    
                For Each instance As String In instances
                    ComboBox1.Items.Add(instance)
                Next
    
                ComboBox1.SelectedIndex = 0
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    > ... pro al mostrar el nombre del Servidor con su instancia, que el
    > nombre lo muestre como ejemplo: ".\SQLExpress", ...

    ¡Bueno! La función GetInstalledInstancesSqlServer comentada te devolverá los nombres de las instancias en el formato NombreEquipo\NombreInstancia, por lo que te aparecerán como:

        NombreEquipo                    --> Para la instancia (local)
        NombreEquipo\SqlExpress   --> Para una instancia con nombre llamada SqlExpress
        NombreEquipo\MiInstancia  --> Para una instancia con nombre llamada MiInstancia

    Por tanto, entiendo que con esos nombres no vas a tener ningún problema para asignárselos tal cual al parámetro 'Data Source' de la cadena de conexión que utilices para conectarte al servidor correspondiente.

    Pero si por capricho o por los motivos que sea, deseas que en lugar de 'NombreEquipo' aparezca un punto ('.'), eso ya te lo dejo como ejercicio porque, por ejemplo, bastaría con hacer un simple reemplazo de una cadena alfanumérica por otra cadena alfanumérica, o ver la posibilidad de insertar en la función GetInstalledInstancesSqlServer  el "." en lugar de 'NombreEquipo'. ;-)

    ¡Eso es todo! Adapta el ejemplo a tus necesidades.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    martes, 4 de julio de 2017 20:49
    Moderador
  • "CristianVI" escribió:

    > estaba realizando las pruebas con el código que indicas y funciona perfectamente
    > para sistemas de 32 bits, pero en sistemas de 64 bits no me muestras las instancias
    > instalada ... en este caso no tiene el registro "InstalledInstances" como el de
    > sistema de 32 bits

    ¡Vamos a ver! Si NO APARECE el valor InstalledInstances, ¿cómo pretendes que te aparezcan las instancias instaladas? Tendrías que preguntarte cuál es el motivo para que no aparezca dicho valor en sistemas de 64 bits y sí lo haga en sistemas de 32 bits. ;-)

    Como en tu mensaje no has comentado nada sobre la plataforma de destino de tu aplicación, lo único que puedo pensar es que únicamente la hayas compilado para plataformas de destino de 32 bits (x86), de ahí que sí se muestren las instancias instaladas de SQL Server de 32 bits. Pero si tanto el sistema operativo como la instalación de SQL Server son de 64 bits, entonces tendrás que compilar tu aplicación explícitamente para plataformas de destino de 64 bits.

    En definitiva, si la aplicación que va a tener acceso a la clave del registro de Windows

        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server

    va a ser ejecutada tanto en plataformas de 32 como de 64 bits, tienes que tener dos compilaciones explícitas de tu proyecto: una para que sean ejecutadas en plataformas de 32 bits (x86) y otra para que sean ejecutadas en plataformas de destino de 64 bits (x64).

    Cómo: Optimizar una aplicación para un tipo específico de CPU

    Debes de tener en cuenta que una aplicación compilada para 32 bits se podrá ejecutar en sistemas operativos Windows de 64 bits, pero a la hora de acceder al registro para leer la clave indicada, accederá al subsistema WOW64, es decir, a la clave

        HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server

    Si en esos equipos de 64 bits existen instalaciones de Microsoft SQL Server también de 64 bits, no me extraña que no aparezca el valor InstalledInstances en la clave del subsistema WOW64 indicada si tu aplicación la has compilado explícitamente para plataformas de destino de 32 bits. Ahora bien, si las instalaciones de SQL Server fueran de 32 bits, entonces sí aparecería el valor comentado, porque éste figuraría en el subsistema WOW64.

    Y si a pesar de lo indicado continuas sin poder obtener el valor de las instancias instaladas de SQL Server en sistemas de 64 bits, entonces mejor será que facilites más información sobre la plataforma de destino con la que has compilado tu proyecto y versiones de Windows y SQL Server (si son de 32 o de 64 bits) instaladas en los equipos cliente.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    viernes, 7 de julio de 2017 7:17
    Moderador

Todas las respuestas

  • "CristianVI" preguntó:

    > Mi pregunta es como mostrar las instancias de SQL Server Local, no en Red, ...
    > buscando por Internet, encontré el siguiente código, pero es demoroso
    >
    >  tablaServidores = servidores.GetDataSources()

    Hola:

    Si 'tablaServidores' es un objeto del tipo System.Data.Sql.SqlDataSourceEnumerator, no me extraña que se demore en su ejecución, y bastante, el método GetDataSources, el cual hay que utilizarlo con precaución.

    Como escribes que no te interesa conocer las instancias de SQL Server existentes en red, hay una solución muy fácil y efectiva para salir del paso, que consiste en saber leer las correspondientes claves del registro de Windows, tal y como muestra la siguiente función:

        ''' <summary>
        ''' Devuelve un array con los nombres de las instancias locales instaladas de SQL Server.
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Shared Function GetInstalledInstancesSqlServer() As String()
    
            ' Inicializar las matrices a la vez que se declaran.
            Dim instances64Bit As String() = New String() {}
            Dim instances32Bit As String() = New String() {}
    
            ' Instancias instaladas de SQL Server.
            Dim keyName As String = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server"
            Dim value As Object = Microsoft.Win32.Registry.GetValue(keyName, "InstalledInstances", New String() {})
            If (Not value Is Nothing) Then
                ' NO ELIMINAR la verificación Nothing, porque si no existe la clave éste será
                ' el valor que tenga la variable 'value'.
                instances64Bit = DirectCast(value, String())
            End If
    
            ' Si el sistema operativo es de 64 bits, obtenemos las posibles instancias
            ' instaladas de SQL Server de 32 bits existentes en el subsistema WOW64.
            keyName = "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server"
            value = Microsoft.Win32.Registry.GetValue(keyName, "InstalledInstances", New String() {})
            If (Not value Is Nothing) Then
                ' NO ELIMINAR la verificación Nothing, porque si no existe la clave éste será
                ' el valor que tenga la variable 'value'.
                instances32Bit = DirectCast(value, String())
            End If
    
            ' Nombre del equipo
            Dim cn As String = Environment.GetEnvironmentVariable("COMPUTERNAME")
    
            Dim localInstanceNames As New List(Of String)(instances64Bit)
            localInstanceNames = localInstanceNames.Union(instances32Bit).ToList()
    
            For n As Int32 = 0 To localInstanceNames.Count - 1
                Dim name As String = localInstanceNames(n)
                If (name.Equals("MSSQLSERVER", StringComparison.OrdinalIgnoreCase)) Then
                    localInstanceNames(n) = cn
                Else
                    localInstanceNames(n) = IO.Path.Combine(cn, name)
                End If
            Next
    
            Return localInstanceNames.ToArray()
    
        End Function

    Por ejemplo, para mostrar en un control ComboBox los nombres de las instancias locales de SQL Server instaladas, simplemente ejecutarías lo siguiente:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ComboBox1.Items.Clear()
    
            Try
                Dim instances As String() = GetInstalledInstancesSqlServer()
                If (instances Is Nothing) Then
                    MessageBox.Show("No existen instancias instaladas de SQL Server.")
                    Return
                End If
    
                For Each instance As String In instances
                    ComboBox1.Items.Add(instance)
                Next
    
                ComboBox1.SelectedIndex = 0
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    > ... pro al mostrar el nombre del Servidor con su instancia, que el
    > nombre lo muestre como ejemplo: ".\SQLExpress", ...

    ¡Bueno! La función GetInstalledInstancesSqlServer comentada te devolverá los nombres de las instancias en el formato NombreEquipo\NombreInstancia, por lo que te aparecerán como:

        NombreEquipo                    --> Para la instancia (local)
        NombreEquipo\SqlExpress   --> Para una instancia con nombre llamada SqlExpress
        NombreEquipo\MiInstancia  --> Para una instancia con nombre llamada MiInstancia

    Por tanto, entiendo que con esos nombres no vas a tener ningún problema para asignárselos tal cual al parámetro 'Data Source' de la cadena de conexión que utilices para conectarte al servidor correspondiente.

    Pero si por capricho o por los motivos que sea, deseas que en lugar de 'NombreEquipo' aparezca un punto ('.'), eso ya te lo dejo como ejercicio porque, por ejemplo, bastaría con hacer un simple reemplazo de una cadena alfanumérica por otra cadena alfanumérica, o ver la posibilidad de insertar en la función GetInstalledInstancesSqlServer  el "." en lugar de 'NombreEquipo'. ;-)

    ¡Eso es todo! Adapta el ejemplo a tus necesidades.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    martes, 4 de julio de 2017 20:49
    Moderador
  • Estimado Enrique,

    Gracias por tu ayuda, estaba realizando las pruebas con el código que indicas y funciona perfectamente para sistemas de 32 bits, pero en sistemas de 64 bits no me muestras las instancias instalada, revisando en los registros me muestra lo siguiente:

    en este caso no tiene el registro "InstalledInstances" como el de sistema de 32 bits, agradeceré su ayuda.

    jueves, 6 de julio de 2017 19:40
  • "CristianVI" escribió:

    > estaba realizando las pruebas con el código que indicas y funciona perfectamente
    > para sistemas de 32 bits, pero en sistemas de 64 bits no me muestras las instancias
    > instalada ... en este caso no tiene el registro "InstalledInstances" como el de
    > sistema de 32 bits

    ¡Vamos a ver! Si NO APARECE el valor InstalledInstances, ¿cómo pretendes que te aparezcan las instancias instaladas? Tendrías que preguntarte cuál es el motivo para que no aparezca dicho valor en sistemas de 64 bits y sí lo haga en sistemas de 32 bits. ;-)

    Como en tu mensaje no has comentado nada sobre la plataforma de destino de tu aplicación, lo único que puedo pensar es que únicamente la hayas compilado para plataformas de destino de 32 bits (x86), de ahí que sí se muestren las instancias instaladas de SQL Server de 32 bits. Pero si tanto el sistema operativo como la instalación de SQL Server son de 64 bits, entonces tendrás que compilar tu aplicación explícitamente para plataformas de destino de 64 bits.

    En definitiva, si la aplicación que va a tener acceso a la clave del registro de Windows

        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server

    va a ser ejecutada tanto en plataformas de 32 como de 64 bits, tienes que tener dos compilaciones explícitas de tu proyecto: una para que sean ejecutadas en plataformas de 32 bits (x86) y otra para que sean ejecutadas en plataformas de destino de 64 bits (x64).

    Cómo: Optimizar una aplicación para un tipo específico de CPU

    Debes de tener en cuenta que una aplicación compilada para 32 bits se podrá ejecutar en sistemas operativos Windows de 64 bits, pero a la hora de acceder al registro para leer la clave indicada, accederá al subsistema WOW64, es decir, a la clave

        HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server

    Si en esos equipos de 64 bits existen instalaciones de Microsoft SQL Server también de 64 bits, no me extraña que no aparezca el valor InstalledInstances en la clave del subsistema WOW64 indicada si tu aplicación la has compilado explícitamente para plataformas de destino de 32 bits. Ahora bien, si las instalaciones de SQL Server fueran de 32 bits, entonces sí aparecería el valor comentado, porque éste figuraría en el subsistema WOW64.

    Y si a pesar de lo indicado continuas sin poder obtener el valor de las instancias instaladas de SQL Server en sistemas de 64 bits, entonces mejor será que facilites más información sobre la plataforma de destino con la que has compilado tu proyecto y versiones de Windows y SQL Server (si son de 32 o de 64 bits) instaladas en los equipos cliente.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    viernes, 7 de julio de 2017 7:17
    Moderador
  • Estimado, claramente la aplicación estaba para 32 bits, gracias a tu indicación "Cómo: Optimizar una aplicación para un tipo específico de CPU", se logro resolver este detalle, muchísimas gracias.
    viernes, 7 de julio de 2017 14:02