C#如何以编程方式获取SQL Server的安装路径?

9

如何获取指定 SQL Server 实例(包括默认实例和命名实例)的安装路径?


你想通过这个实现什么目标?根据你的需求,安装路径可能不足够。 - John Saunders
实际上,我需要执行文件的完整路径。 - Julius A
哪个EXE?有好几个,你需要它做什么?根据你的原因,可能有更好的方法来达成你的目的。 - John Saunders
这里有一个类似的 C++ 问题:http://stackoverflow.com/questions/1204920/how-to-get-the-sqlserver-installationpath-using-c/1205137#1205137。 - Bogdan_Ch
3个回答

7
using(RegistryKey sqlServerKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server"))
{
    foreach (string subKeyName in sqlServerKey.GetSubKeyNames())
    {
        if(subKeyName.StartsWith("MSSQL."))
        {
            using(RegistryKey instanceKey = sqlServerKey.OpenSubKey(subKeyName))
            {
                string instanceName = instanceKey.GetValue("").ToString();

                if (instanceName == "MSSQLSERVER")//say
                {
                    string path = instanceKey.OpenSubKey(@"Setup").GetValue("SQLBinRoot").ToString();
                    path = Path.Combine(path, "sqlserver.exe");
                    return path;
                }
            }
        }
    }
}

当然,这取决于SQL Server选择如何使用注册表键,并且一旦它们更改,它就会中断。我相信您会承认Microsoft有权更改自己的注册表键?这就是为什么我问您想要实现什么的原因。可能有一种方法可以做到这一点,而不会在发布到发布之间中断。 - John Saunders
2
如果您正在寻找64位操作系统上的32位实例(相当奇怪,但是可能存在),您需要查找:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server - Alex Klaus

0
如果您有连接字符串,可以选择使用SQL目录。
private string ServerRootDirectory(string connString)
    {
        string path = string.Empty;
        using (SqlConnection con = new SqlConnection(connString))
        {
            con.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = string.Format(@"DECLARE @InstanceName varchar(100), 
                                                        @InstanceLocation varchar(100),
                                                        @InstancePath varchar(100)

                                                SELECT @InstanceName = convert(varchar, ServerProperty('InstanceName'))
                                                EXEC master..xp_regread @rootkey='HKEY_LOCAL_MACHINE',
                                                    @key='Software\Microsoft\Microsoft SQL Server\Instance Names\SQL',
                                                    @value_name=@InstanceName,
                                                    @value=@InstanceLocation OUTPUT
                                                SELECT @InstanceLocation = 'Software\Microsoft\Microsoft SQL Server\'+@InstanceLocation+'\Setup'

                                                EXEC master..xp_regread @rootkey='HKEY_LOCAL_MACHINE',
                                                    @key=@InstanceLocation,
                                                    @value_name='SQLPath',
                                                    @value=@InstancePath OUTPUT
                                                SELECT @InstancePath as RootDirectoryPath");
            path = (string)cmd.ExecuteScalar();
            con.Close();
        }
        return path;
    }

以上代码的输出:

c:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接