2008-09-03 13 views
5

Mam kod, który używa SMO do zapełnienia listy dostępnych serwerów SQL i baz danych. Chociaż nie obsługujemy już programu SQL Server 2000, możliwe jest, że kod mógł zostać uruchomiony na komputerze, na którym zainstalowany jest program SQL Server 2000 i nie ma zainstalowanej biblioteki SMO. Postanowiłbym najpierw sprawdzić SMO i zręcznie zniszczyć funkcjonalność, zamiast wysadzać w twarz użytkownika. Jaki jest najlepszy sposób na wykrycie, czy SMO jest dostępny na komputerze?Jaki jest najlepszy sposób na wykrycie obecności SMO?

Każdy przykład, który widziałem przez szybkie skanowanie Google, to odmiana "szukaj C: \ Program Files \ Microsoft SQL Server \ 90 \ SDK \ Assemblies \ Microsoft.SqlServer.Smo.dll". Problem z tym podejściem polega na tym, że działa tylko z SQL Server 2005. Jeśli SQL Server 2008 jest jedynym zainstalowanym programem SQL Server, wówczas ścieżka będzie inna.

+1

Pokrewne pytanie: Czy napotkali Państwo problem z działaniem tego samego kodu z 2005 i 2008 r. Jeśli tak, w jaki sposób go rozwiązaliście? – Mostlyharmless

Odpowiedz

3

Jest to rodzaj przylegający, ale szybkie sprawdzenie rejestru wydaje się działać. Pod HKEY_CLASSES_ROOT zostanie zarejestrowana duża liczba klas z zespołów SMO. Wszystko, co musiałem zrobić, to wybrać jedną z klas SMO i sprawdzić istnienie klucza o tej samej nazwie. Następująca funkcja zwróci wartość true, jeśli zainstalowano SMO, a false, jeśli jest inaczej.

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

Po prostu próbuję utworzyć instancję jakiegoś obiektu SMO. Jeśli zawiedzie, nie ma go.

6

Spojrzałem na SharedManagementObjects.msi z pakietu funkcji SQL2008 R2 i mojego rejestru Windows (SQL2008 R2 Dev jest zainstalowany na tym komputerze) i uważam, że są to klucze rejestru, których należy użyć do wykrywania SMO (Wszystkie w HKLM):

OPROGRAMOWANIE \ Microsoft \ Microsoft SQL Server \ SharedManagementObjects \ CurrentVersion - to najwyraźniej główny klucz, który wskazuje, że zainstalowana jest jakaś wersja SMO.

OPROGRAMOWANIE \ Microsoft \ Microsoft SQL Server 2008 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion - prawdopodobnie oznacza to, że angielski 2008 jest zainstalowany. Prawdopodobnie wystarczy sprawdzenie obecności SOFTWARE \ Microsoft \ Microsoft SQL Server 2008 Redist \ SharedManagementObjects.

samo dotyczy SQL2012: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server 2012 REDIST \ SharedManagementObjects \ 1033 \ CurrentVersion

lecz nie SQL2005! mimo że ja też mam zainstalowany 2005 na tym komputerze.

Jeszcze jedno, Normalnie chciałbyś mieć również typy CLR systemu Microsoft SQL Server, ponieważ SMO zależy od nich. SQLSysClrTypes.msi ma tylko jeden klucz rejestru: SOFTWARE \ Microsoft \ Microsoft SQL Server \ RefCount \ SQLSysClrTypes

+0

W przypadku redystrybucyjnych typów CLR klucz rejestru wydaje się być "HKLM \ SOFTWARE \ Microsoft \ Microsoft SQL Server 2008 Redist \ SQL Server System CLR Types". Informacje, które możesz chcieć sprawdzić (np. Wersja) znajdują się w podkluczach. – jpmc26

1

Rozwiązanie dla SQL Server 2012:

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

Można sprawdzić, czy ten klucz istnieje (i wyboru jeśli wartość jest większa niż 11).

0

Po prostu krótka uwaga: HKLM \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ SharedManagementObjects \ CurrentVersion \ Version nie reprezentuje bieżącej wersji, ponieważ może być zainstalowanych kilka wersji.

Powyższy klucz rejestru jest aktualizowany po zainstalowaniu wersji, więc jeśli zainstalowałeś SMO 2014, powinieneś zobaczyć 12.x, ale jeśli później zainstalujesz SMO 2012, wersja ta zmieni się na 11.x Jeśli następnie postanawia naprawić 2014 installtion, wtedy byłoby znowu wersja 12.x

Powinieneś lepiej spojrzeć na: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server 2012 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion

lub HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server 2014 REDIST \ SharedManagementObjects \ 1033 \ CurrentVersion

czy ktoś wie, czy jest zagwarantowane 1033? (tylko angielska wersja)

+0

Cześć, testowałem to i nie gwarantuję, że jest to 1033 (zależy to od instalowanego SMO). – Saragani

Powiązane problemy