我有一些代码使用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,则路径将不同。
答案 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是否有保障吗? (仅限英文版)