检查SQL Server是否已安装C#

时间:2016-02-13 03:00:58

标签: c# sql-server

我在C#中完成了一个包含SQL Server数据库的应用程序。

如何检查用户是否安装了SQL Server 2012 Express本地数据库?

是否可以在x86,x64上通过注册表进行检查?

基本上这个想法是如果用户没有安装SQL Server,应用程序建议安装它。

作为安装程序,我在安装程序中没有依赖SQL Server 2012 Express Local DB。

感谢。

1 个答案:

答案 0 :(得分:3)

您必须遍历卸载GUID并找到以关键字" Microsoft SQL Server 2012"开头的GUID。你可以通过转到控制面板>找到它。节目和特征>并查看"显示名称"列。

// HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\的Windows \ CurrentVersion \卸载{guidVariable} \ DisplayName的

..应该匹配" Microsoft SQL Server 2012 *"外卡。

我没有确切的代码,但这应该让你开始。只需遍历"卸载"的所有孩子。键,然后找到" DisplayName"获得价值的关键。 " GUID"下面的变量应该是你的迭代器,因为你不知道那个值。我确定你可以获得所有GUID值的列表,这些值是"卸载"的子键。键。

string UninstallRegKeyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
Guid UninstallGuid = new Guid(GUID);

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(UninstallRegKeyPath, true))
{
    if (key == null)
    {
        return;
    }
    try
    {
        string guidText = UninstallGuid.ToString("B");
        RegistryKey child = key.OpenSubKey(guidText);
        if (child != null)
        {
        string displayName = child.GetValue("DisplayName").ToString();
        if (displayName.Contains("Microsoft SQL Server 2012"))
        {
            // implement logic when MSSQL 2012 is found
        }       
        child.Close();
        }
    }
}

请小心谨慎。有32位安装和64位安装。 Wow6432Node包含我认为的32位程序,因此默认情况下安装在C:\Program Files (x86)\中的所有程序(但可能在任何地方)。我还可以找到所有64位程序的其他位置,默认情况下安装在C:\Program Files\中(并且可以安装在任何地方)。

编辑:

试试这个。您可能还想替换" LocalMachine"用" CurrentUser"因为许多安装程序允许您为用户或所有用户配置它们。

        using (RegistryKey root = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"))
        {
            string searchKey = @"Microsoft SQL Server 2012";
            string subKeyName = "DisplayName";

            foreach (string keyname in root.GetSubKeyNames())
            {
                //Console.WriteLine(keyname);
                using (RegistryKey key = root.OpenSubKey(keyname))
                {
                    try  // in case "DisplayName doesn't exist
                    {
                        string displayName = key.GetValue(subKeyName).ToString();
                        if (displayName.StartsWith(searchKey))
                            Console.WriteLine("GUID: " + keyname + Environment.NewLine + displayName + Environment.NewLine);
                    }
                    catch
                    {

                    }

                }
            }
        }

        Console.ReadLine();