检测SMO存在的最佳方法是什么?

时间:2008-09-03 19:55:14

标签: sql-server smo

我有一些代码使用SMO来填充可用的SQL Server和数据库列表。虽然我们不再支持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 个答案:

答案 0 :(得分:6)

我查看了SQL2008 R2功能包和我的Windows注册表中的SharedManagementObjects.msi(这台机器上安装了SQL2008 R2 Dev),我相信这些是用于检测SMO的注册密钥(全部在HKLM下) ):

SOFTWARE \ Microsoft \ Microsoft SQL Server \ SharedManagementObjects \ CurrentVersion - 这显然是主键,表示已安装某个版本的SMO。

SOFTWARE \ Microsoft \ Microsoft SQL Server 2008 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion - 这可能意味着安装了2008英语。可能只是检查是否存在SOFTWARE \ Microsoft \ Microsoft SQL Server 2008 Redist \ SharedManagementObjects就足够了。

同样适用于SQL2012: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server 2012 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion

但不是SQL2005!即使我也在这台机器上安装了2005。

还有一件事,您通常也需要Microsoft SQL Server系统CLR类型,因为SMO依赖于它们。 SQLSysClrTypes.msi只有一个注册表项: SOFTWARE \ Microsoft \ Microsoft SQL Server \ RefCount \ SQLSysClrTypes

答案 1 :(得分:3)

这有点笨拙,但快速检查注册表似乎有效。在HKEY_CLASSES_ROOT下,将注册SMO程序集中的大量类。我需要做的就是选择一个SMO类并检查是否存在具有相同名称的密钥。如果已安装SMO,则以下函数将返回true,否则返回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;
}

答案 2 :(得分:3)

我所做的只是尝试创建一些SMO对象的实例。如果它失败了,那就不存在了。

答案 3 :(得分:1)

SQL Server 2012的解决方案:

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

您可以检查此密钥是否存在(并检查该值是否大于11)。

答案 4 :(得分:0)

快速说明: HKLM \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ SharedManagementObjects \ CurrentVersion \ Version不代表安装的当前版本,因为可能安装了多个版本。

安装版本时,上面的注册表项正在更新,因此,如果您安装了SMO 2014,那么您应该看到12.x,但如果之后您安装了SMO 2012,则此版本将更改为11.x 如果您随后决定修复2014年安装,则版本将再次为12.x

你最好看看: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server 2012 Redist \ SharedManagementObjects \ 1033 \ CurrentVersion

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

有人知道1033是否有保障吗? (仅限英文版)