2008-09-03 14 views
5

Tengo un código que usa SMO para rellenar una lista de servidores y bases de datos SQL disponibles. Si bien ya no admitimos SQL Server 2000, es posible que el código se ejecute en un equipo que no sea SQL Server 2000 y que no tenga la biblioteca SMO instalada. Me gustaría comprobar primero SMO y degradar la funcionalidad con gracia en lugar de explotar en la cara del usuario. ¿Cuál es la mejor manera de detectar si SMO está disponible en una máquina o no?¿Cuál es la mejor forma de detectar la presencia de SMO?

Cada ejemplo que he visto a través de un análisis rápido de Google era una variación de "buscar C: \ Archivos de programa \ Microsoft SQL Server \ 90 \ SDK \ Assemblies \ Microsoft.SqlServer.Smo.dll". El problema con este enfoque es que solo funciona con SQL Server 2005. Si SQL Server 2008 es el único servidor SQL instalado, la ruta será diferente.

+1

Una pregunta relacionada: ¿Ha enfrentado el problema de hacer que el mismo código funcione en 2005 y 2008. Si es así, ¿cómo lo resolvió? – Mostlyharmless

Respuesta

3

Esto es un poco torpe, pero una comprobación rápida del registro parece funcionar. En HKEY_CLASSES_ROOT, se registrará una gran cantidad de clases de los ensamblados de SMO. Todo lo que tenía que hacer era elegir una de las clases de SMO y verificar la existencia de la clave con el mismo nombre. La siguiente función devolverá verdadero si SMO ha sido instalado, falso si no.

private bool CheckForSmo() 
{ 
    string RegKeyName = @"Microsoft.SqlServer.Management.Smo.Database"; 
    bool result = false; 
    Microsoft.Win32.RegistryKey hkcr = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(RegKeyName); 
    result = hkcr != null; 

    if (hkcr != null) 
    { 
     hkcr.Close(); 
    } 

    return result; 
} 
3

Lo que hago es simplemente intentar crear una instancia de algún objeto SMO. Si falla, no está allí.

6

He echado un vistazo a SharedManagementObjects.msi del paquete de características SQL2008 R2 y mi Registro de Windows (SQL2008 R2 Dev está instalado en esta máquina) y creo que estas son las claves de registro que se deben usar para detectar SMO (Todo bajo HKLM):

SOFTWARE \ Microsoft \ Microsoft SQL Server \ SharedManagementObjects \ CurrentVersion: aparentemente esta es la clave principal, lo que indica que hay instalada alguna versión de SMO.

SOFTWARE \ Microsoft \ Microsoft SQL Server 2008 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion - esto probablemente significa que 2008 English está instalado. Probablemente basta con comprobar la presencia de SOFTWARE \ Microsoft \ Microsoft SQL Server 2008 Redist \ SharedManagementObjects.

Lo mismo se aplica a SQL2012: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server 2012 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion

pero no SQL2005! a pesar de que también tengo 2005 instalado en esta máquina.

Una cosa más, normalmente también querría los tipos CLR del sistema de servidor SQL de Microsoft, ya que SMO depende de ellos. El SQLSysClrTypes.msi tiene una única clave del registro: SOFTWARE \ Microsoft \ Microsoft SQL Server \ RefCount \ SQLSysClrTypes

+0

Con los tipos CLR redistribuibles, la clave de registro parece ser 'HKLM \ SOFTWARE \ Microsoft \ Microsoft SQL Server 2008 Redist \ SQL Server System CLR Types'. La información que tal vez quiera verificar (como la versión) está en subclaves. – jpmc26

1

Solución para SQL Server 2012:

HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion\Version 

Puede comprobar si existe esta clave (y verificación si el valor es mayor que 11).

0

Solo una nota rápida: HKLM \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ SharedManagementObjects \ CurrentVersion \ Version no representa la versión actual que está instalada, porque podría haber varias versiones instaladas.

La clave de registro anterior se actualiza cuando instala una versión, por lo que si ha instalado SMO 2014, entonces debería ver 12.x, pero si luego instala SMO 2012, esta versión cambiará a 11.x Si luego decide reparar el installtion 2014, la versión sería de nuevo 12.x

Usted debe ver mejor: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server 2012 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion

o HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server 2014 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion

¿alguien sabe si se garantiza la 1033? (Significado solamente versión en inglés)

+0

Hola, lo he probado y no está garantizado que sea 1033 (depende del SMO que se está instalando). – Saragani

Cuestiones relacionadas