5

我有一些代码使用 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,则路径将不同。

4

5 回答 5

6

我查看了 SQL2008 R2 功能包中的 SharedManagementObjects.msi 和我的 Windows 注册表(SQL2008 R2 Dev 安装在这台机器上),我相信这些是应该用来检测 SMO 的 reg 键(全部在 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

于 2012-03-23T22:21:48.047 回答
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;
}
于 2008-09-03T20:59:35.003 回答
3

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

于 2008-11-14T23:10:37.130 回答
1

SQL Server 2012 的解决方案:

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

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

于 2013-04-17T14:07:46.173 回答
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是否有保证?(仅指英文版)

于 2015-06-04T10:55:33.043 回答