shreyassv Ответов: 1

Получение локальных экземпляров SQL server с помощью C#


я попробовал использовать следующий метод

DataTable dataTable = SmoApplication.EnumAvailableSqlServers(true);

            foreach (DataRow dataRow in dataTable.Rows)
            {
                Console.WriteLine(dataRow["Instance"] as string);
            }

в datatable нет имен экземпляров, но есть только системные имена.

DataTable dt = SqlDataSourceEnumerator.Instance.GetDataSources();
            foreach (System.Data.DataRow row in dt.Rows)
            {
                foreach (System.Data.DataColumn col in dt.Columns)
                {
                   Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
                }
            }


то же самое, что и выше,
there are no instance names in datatable but there are only system names.


я попытался с помощью управляемого компьютера, но мне выдает исключение в Win-8

Мое требование-проверить, есть ли instnace с Sqlexpress уже в системе, если его там нет, то установите sql server с экземпляром Sqlexpress.

Что я уже пробовал:

i tried using Managed computer also but i throws exception in win-8

My requirement is to check if there is an instance with name SqlExpress already in system, if its not there then install sql server with Sqlexpress Instance.

1 Ответов

Рейтинг:
10

Richard Deeming

EnumAvailableSqlServers и SqlDataSourceEnumerator будет находить именованные экземпляры только в том случае, если запущены службы браузера SQL Server.

ManagedComputer будут найдены только серверы, зарегистрированные в среде SQL Server Management Studio.

Если вы просто ищете серверы на текущем компьютере, вы можете прочитать информацию из реестра. Ключ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server имеет значение, называемое InstalledInstances который содержит имя экземпляров SQL Server, установленных на локальном компьютере:

public static class SqlHelper
{
    public static IEnumerable<string> ListLocalSqlInstances()
    {
        if (Environment.Is64BitOperatingSystem)
        {
            using (var hive = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
            {
                foreach (string item in ListLocalSqlInstances(hive))
                {
                    yield return item;
                }
            }
            
            using (var hive = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
            {
                foreach (string item in ListLocalSqlInstances(hive))
                {
                    yield return item;
                }
            }
        }
        else
        {
            foreach (string item in ListLocalSqlInstances(Registry.LocalMachine))
            {
                yield return item;
            }
        }
    }
    
    private static IEnumerable<string> ListLocalSqlInstances(RegistryKey hive)
    {
        const string keyName = @"Software\Microsoft\Microsoft SQL Server";
        const string valueName = "InstalledInstances";
        const string defaultName = "MSSQLSERVER";
        
        using (var key = hive.OpenSubKey(keyName, false))
        {
            if (key == null) return Enumerable.Empty<string>();
            
            var value = key.GetValue(valueName) as string[];
            if (value == null) return Enumerable.Empty<string>();
            
            for (int index = 0; index < value.Length; index++)
            {
                if (string.Equals(value[index], defaultName, StringComparison.OrdinalIgnoreCase))
                {
                    value[index] = ".";
                }
                else
                {
                    value[index] = @".\" + value[index];
                }
            }
            
            return value;
        }
    }
}