none
Duda sobre como funciona la detección de Instancias en SQL Server mediante programación RRS feed

  • Pregunta

  • Estoy aprendiendo SQL Server y en una aplicación quiero cargar todas las 
    Instancias de mi SQL Server express 2014 instalado. La verdad es que sólo dispongo
    de una Instancia "(local)\\sqlexpress".

    La pregunta es la siguiente ¿por qué razón la primera opción no me carga la única instancia que tengo
    instalada y la segunda opción funciona correctamente?


    Opción 1:
           private void btnLoadServers_Click(object sender, EventArgs e)
           {
                try
                {
                    DataTable servers = SqlDataSourceEnumerator.Instance.GetDataSources();
                    for (int i = 0; i < servers.Rows.Count; i++)
                    {
                        comboServers.Items.Add(servers.Rows[i]["ServerName"] + "\\" + servers.Rows[i]["InstanceName"]);
                        //comboDB2Ser.Items.Add(servers.Rows[i]["ServerName"] + "\\" + servers.Rows[i]["InstanceName"]);
                    }
                    comboServers.SelectedIndex = 0;
                    //comboDB2Ser.SelectedIndex = 0;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }


    Opción 2:

            private string[] instanciasInstaladas()
            {
                Microsoft.Win32.RegistryKey rk;
                rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server", false);
                string[] s;
                s = (string[])(rk.GetValue("InstalledInstances"));
                return s;
            }

            public void btnLoadServers_Click(System.Object sender, System.EventArgs e)
            {
                MessageBox.Show("Cargando las instancias...");
                this.Show();

                string[] instancias;
                instancias = instanciasInstaladas();
                foreach (string s in instancias)
                {
                    if (s == "MSSQLSERVER")
                    {
                        comboServers.Items.Add("(local)");
                    }
                    else
                    {
                        comboServers.Items.Add("(local)\\" + s);
                    }
                }
                comboServers.Text = "(local)";

                MessageBox.Show("Indica la base de datos a crear y selecciona la instancia");
            }

    Hay algo que no llego a comprender. Agradezco comentarios al respecto.
    domingo, 15 de marzo de 2020 11:18

Respuestas

  • Probablemente lo que sucede es que tienes parado el servicio SQL Browser. SqlDataSourceEnumerator lo que hace es interrogar a este servicio. Esto tiene la ventaja de que puede enumerar todas las instancias de todos los equipos de la red local que tengan en marcha dicho servicio. Y tiene el inconveniente de que no devuelve nada si el servicio no está en marcha.

    La Opción 2 solo funciona en el equipo local porque lee directamente del Registro de Windows, así que no puede enumerar instancias en otros equipos. Pero tiene la ventaja de que funciona aunque el Servicio SQL Browser esté detenido.

    • Marcado como respuesta IsidroPadilla domingo, 15 de marzo de 2020 14:38
    domingo, 15 de marzo de 2020 13:03

Todas las respuestas

  • Probablemente lo que sucede es que tienes parado el servicio SQL Browser. SqlDataSourceEnumerator lo que hace es interrogar a este servicio. Esto tiene la ventaja de que puede enumerar todas las instancias de todos los equipos de la red local que tengan en marcha dicho servicio. Y tiene el inconveniente de que no devuelve nada si el servicio no está en marcha.

    La Opción 2 solo funciona en el equipo local porque lee directamente del Registro de Windows, así que no puede enumerar instancias en otros equipos. Pero tiene la ventaja de que funciona aunque el Servicio SQL Browser esté detenido.

    • Marcado como respuesta IsidroPadilla domingo, 15 de marzo de 2020 14:38
    domingo, 15 de marzo de 2020 13:03
  • Efectivamente ese era el problema, iniciando SQL Browser se solucionó el problema. Con maestros como tu se aprende rápido. Muchas gracias por tu ayuda.

    domingo, 15 de marzo de 2020 14:23