2010-03-14 16 views
6

Estoy haciendo una aplicación que es una interfaz de usuario para acceder a 2 tipos de bases de datos: SQLite y SQL Server.Compruebe si SQL Server está instalado en una máquina a través de C#

La cosa es que necesita duerma SQLite para ser "instalado" desde su base de datos de sólo un flatfile, pero por otro lado, necesita ser instalado antes de usar SQL Server (expreso/normal). Mi pregunta es simple:

¿Hay alguna manera de averiguar si una instancia de SQL Server se ha instalado en la máquina local mediante un programa C#?

+1

misma pregunta: http: // stackoverflow .com/questions/2381055/check-if-sql-server-any-version-is-installed –

+0

lo siento. Gracias ! – Shrayas

Respuesta

8

Si la aplicación está instalada en la máquina en cuestión, que puede inspeccionar el registro con algo similar a esto:

using Microsoft.Win32; 
RegistryKey RK = Registry.CurrentUser.OpenSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Microsoft SQL Server"); 
    if(RK != null) 
    { 
     // It's there 
    } 
    else 
    { 
     // It's not there 
    } 
+0

se ve bien, simplemente agregue un @ al comienzo de su parametro OpenSubKey para permitir las barras diagonales inversas;) gracias por la respuesta! – JM1990

14

Tienes varias formas de hacerlo:

  • SmoApplication.EnumAvailableSqlServers()
  • SqlDataSourceEnumerator.Instance
  • Acceso directo a reg terio

Acceso directo no es la solución recomendada por la EM, ya que pueden cambiar las llaves/caminos. Pero las otras soluciones no son sólidas y no proporciona instancias en plataformas de 64 bits.

Por lo tanto, prefiero comprobar las instancias de SQL Server en el Registro del sistema. Al hacerlo, tenga en cuenta la diferencia en el acceso de Registro entre las plataformas x86 y x64. Windows de 64 bits almacena datos en diferentes partes del registro del sistema y los combina en vistas. Entonces, usar RegistryView es esencial.

using Microsoft.Win32; 

RegistryView registryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32; 
using (RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView)) 
{ 
    RegistryKey instanceKey = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", false); 
    if (instanceKey != null) 
    { 
     foreach (var instanceName in instanceKey.GetValueNames()) 
     { 
      Console.WriteLine(Environment.MachineName + @"\" + instanceName); 
     } 
    } 
} 

Si está buscando instancias de 32 bits en un sistema operativo de 64 bits (bastante raro, pero posible), que tendrá que buscar:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server 
Cuestiones relacionadas