Какой лучший способ обнаружить присутствие SMO? - PullRequest
5 голосов
/ 03 сентября 2008

У меня есть некоторый код, который использует SMO для заполнения списка доступных SQL-серверов и баз данных. Хотя мы больше не поддерживаем SQL Server 2000, возможно, что код может быть запущен на компьютере, на котором установлен SQL Server 2000, и не имеет установленной библиотеки SMO. Я бы предпочел сначала проверить SMO и грациозно ухудшить функциональность, а не взорвать лицо пользователя. Как лучше всего определить, доступен ли SMO ​​на компьютере?

Каждый пример, который я видел во время быстрого сканирования Google, представлял собой вариант «ищите C: \ Program Files \ Microsoft SQL Server \ 90 \ SDK \ Assemblies \ Microsoft.SqlServer.Smo.dll». Проблема такого подхода заключается в том, что он работает только с SQL Server 2005. Если SQL Server 2008 является единственным установленным SQL Server, путь будет другим.

Ответы [ 5 ]

6 голосов
/ 24 марта 2012

Я взглянул на SharedManagementObjects.msi из пакета функций SQL2008 R2 и моего реестра Windows (на этом компьютере установлен SQL2008 R2 Dev), и я считаю, что это ключи reg, которые следует использовать для обнаружения SMO (Все в HKLM ):

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Microsoft SQL Server \ SharedManagementObjects \ CurrentVersion - это, очевидно, основной ключ, указывающий, что установлена ​​некоторая версия SMO.

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Microsoft SQL Server 2008 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion - это, вероятно, означает, что установлен английский язык 2008 года. Возможно, достаточно просто проверить наличие ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ \ Microsoft \ Microsoft SQL Server 2008 Redist \ SharedManagementObjects.

То же самое относится к SQL2012: HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Microsoft SQL Server 2012 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion

Но НЕ SQL2005! хотя у меня на этом компьютере также установлен 2005 год.

Еще одна вещь, обычно вы также хотели бы иметь системные типы CLR Microsoft SQL Server, поскольку SMO зависит от них. SQLSysClrTypes.msi имеет только один раздел реестра: ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Microsoft SQL Server \ RefCount \ SQLSysClrTypes

3 голосов
/ 15 ноября 2008

Я просто пытаюсь создать экземпляр какого-либо объекта SMO. Если это не удается, его там нет.

3 голосов
/ 04 сентября 2008

Это немного неуклюже, но быстрая проверка реестра, кажется, работает. Под HKEY_CLASSES_ROOT будет зарегистрировано большое количество классов из сборок SMO. Все, что мне нужно было сделать, это выбрать один из классов SMO и проверить наличие ключа с тем же именем. Следующая функция вернет true, если SMO ​​был установлен, и false, если в противном случае.

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;
}
1 голос
/ 17 апреля 2013

Решение для SQL Server 2012:

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

Вы можете проверить, существует ли этот ключ (и проверить, является ли значение больше 11).

0 голосов
/ 04 июня 2015

Просто краткая заметка: HKLM \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ SharedManagementObjects \ CurrentVersion \ Version не представляет установленную текущую версию, поскольку может быть установлено несколько версий.

Раздел реестра, указанный выше, обновляется при установке версии, поэтому, если вы установили SMO ​​2014, вы должны увидеть 12.x, но если после этого вы установите SMO 2012, то эта версия изменится на 11.x Если затем вы решите восстановить установку 2014 года, тогда версия снова будет 12.x

Тебе лучше взглянуть на: HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Microsoft SQL Server 2012 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion

или HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Microsoft SQL Server 2014 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion

Кто-нибудь знает, гарантируется ли 1033? (Имеется в виду только английская версия)

...