2008-09-03 90 views
5

我有一些代码使用SMO来填充可用SQL Server和数据库的列表。虽然我们不再支持SQL Server 2000,但有可能代码可能在SQL Server 2000的计算机上运行,​​并且没有安装SMO库。我会倾向于首先检查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,那么路径将会不同。

+1

一个相关的问题:你是否面临过与2005年和2008年相同的代码工作的问题。如果是的话,你是如何解决它的? – Mostlyharmless 2008-11-13 19:37:16

回答

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; 
} 
3

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

6

我看了一下SQL2008 R2功能包和我的Windows注册表(本机上安装了SQL2008 R2 Dev)中的SharedManagementObjects.msi,我相信这些是应该用来检测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 SQL Server的2012的Redist \ SharedManagementObjects \ 1033 \ CURRENTVERSION

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

还有一件事,因为SMO依赖于它们,所以通常还需要Microsoft SQL Server系统CLR类型。 的SQLSysClrTypes.msi只有一个注册表项: SOFTWARE \微软\ Microsoft SQL Server的\引用次数\ SQLSysClrTypes

+0

对于可重新分发的CLR类型,注册表项似乎是'HKLM \ SOFTWARE \ Microsoft \ Microsoft SQL Server 2008 Redist \ SQL Server系统CLR类型`。您可能想要检查的信息(如版本)位于子键中。 – jpmc26 2013-11-08 08:24:16

1

解决方案用于SQL Server 2012:

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

您可以检查此注册表项存在(并检查如果该值大于11)。

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 SQL Server的2012的Redist \ SharedManagementObjects \ 1033 \ CURRENTVERSION

或HKEY_LOCAL_MACHINE \ SOFTWARE \微软\ Microsoft SQL Server的2014的Redist \ SharedManagementObjects \ 1033 \ CURRENTVERSION

是否有人知道,如果1033有保证?

+0

嗨,我已经测试过了,它不保证它是1033(它取决于正在安装的SMO)。 – Saragani 2015-06-17 10:23:51