Principales respuestas
Duda sobre como funciona la detección de Instancias en SQL Server mediante programación

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.
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
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
-