Это, кажется, довольно распространенный вопрос, но ни один из ответов, которые я видел, был особенно удовлетворительным. Я хочу получить список имен экземпляров MS SQL Server, установленных на локальном компьютере, независимо от того, запущены они или нет. Для целей этого обсуждения я в порядке, просто нахожу экземпляры SQL 2005 и новее; Я могу обрабатывать 2000 и более ранние, используя "устаревшие" методы (т.е. Просматривать в реестре). Я требую, чтобы он не зависел от службы браузера SQL Server (по умолчанию он отключен по умолчанию в настоящее время), и что 64-разрядные экземпляры возвращаются, даже когда приложение 32-разрядное.
Предложения, которые я видел:
-
Перейдите через реестр: предположительно Не рекомендуется из-за того, что записи в реестре недокументированы; MS может изменить их в будущем. Что еще более важно, насколько я могу судить, 64-разрядные экземпляры MSSQL входят в 64-разрядный HKLM\SOFTWARE\Microsoft\Microsoft SQL Server InstalledInstances, а 32-разрядные экземпляры идут в 32-битном, поэтому 32- битное приложение не увидит никаких 64-битных экземпляров.
-
Используйте поставщик SQL WMI для управления конфигурацией, упомянутый в предыдущем сообщении в блоге. Это, кажется, самое близкое, но, несмотря на авторское предупреждение, чтобы избежать использования реестра, поскольку он может измениться, оказалось, что пространство имен WMI изменилось между SQL 2005 и 2008: в 2005 году он был root\Microsoft\SqlServer\ComputerManagement, но в 2008 году это root\Microsoft\SqlServer\ComputerManagement10. Будет ли оно снова изменяться в будущем? Тем не менее, это, вероятно, не большая проблема, если мне нужно обновить мое приложение для будущей версии SQL.
Проблема с методом WMI заключается в том, что класс SqlService возвращает список имен служб, тогда как мне нужны имена экземпляров. Например, вместо MSSQL $INSTANCE я просто хочу INSTANCE. Отключение "MSSQL $" тривиально, так как обрабатывает специальный случай экземпляра по умолчанию, но является ли он надежным? AFAIK, технически нет причин, по которым услугу нельзя было переименовать, сохраняя имя экземпляра одинаковым. Тем не менее, если у кого-то нет лучшего метода, я думаю, что я пойду с этим (получить имена служб и отключить MSSQL $). Класс ServerSettings возвращает имя экземпляра, но не видит 64-разрядный экземпляр SQL 2008 R2 Express, который я установил на своей машине.
-
Используйте
SmoApplication.EnumAvailableSqlServers(true)
: это, похоже, зависит от службы браузера SQL Server. Он отлично работает, если служба Browser запущена, но если это не так, я просто получаю одну строку с именем компьютера как имя сервера и пустое имя экземпляра. -
Используйте
System.Data.Sql.SqlDataSourceEnumerator.GetDataSources()
: та же проблема, что она зависит от браузера SQL Server.
Итак, есть ли другие методы, которые могут работать лучше?