我有一些代码使用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,则路径将不同.
我查看了SQL2008 R2功能包中的SharedManagementObjects.msi和我的Windows注册表(此机器上安装了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