2010-08-28 1 views
2

Я пытаюсь перечислить все экземпляры SQL Server, установленные на локальном компьютере. Я использую SmoApplication.EnumAvailableSqlServers (true). Однако показаны только экземпляры SQL Server Express 2005. Экземпляр по умолчанию 2008 не отображается вообще!Smo не показывает 2008 экземпляры SQL Server, когда существуют экземпляры 2005 года

Я пробовал 2 других решения с SqlServerRegistrations.EnumRegisteredServers() и SqlDataSourceEnumerator.Instance.GetDataSources(), но они также не работают.

Существует еще один вопрос относительно этого (Can't enumerate SQL Server 2008 Registered Servers with SMO), но он, к сожалению, не имеет ответа.

+0

У меня очень похожая проблема - у меня вопрос по адресу: http://stackoverflow.com/questions/3592401/smoapplication-enumavailablesqlservers-fails-to-return-all-servers В моем случае , это экземпляр по умолчанию SQL 2005 не возвращен, и экземпляр SQLQ8 с именем. Необычно, я заметил, что остановка службы SQL Browser делает обнаружение экземпляра SQL05 по умолчанию, но тогда экземпляр SQL08 не возвращается. Мне очень понравилось, что кто-то прольет свет на это! – ChrisA

+0

Крис, я сделал обходное решение в своем приложении - помимо этого, я пытаюсь открыть соединение с экземпляром по умолчанию вручную и посмотреть, было ли оно успешно открыто. Кажется, что обычные способы Microsoft не работают. – Alex

ответ

1

Вот еще одна альтернатива, которую вы могли бы попробовать использовать ManagedComputer Class (Пространство имён: Microsoft.SqlServer.Management.Smo.Wmi).

ManagedComputer mc = new ManagedComputer(); 

foreach (ServerInstance si in mc.ServerInstances) 
{ 
     Console.WriteLine(si.Name); 
} 
+0

Я пробовал это - вчера как это бывает - и он не возвращает никаких экземпляров вообще !! Если у вас есть идеи, почему, пожалуйста, дайте мне знать! (Мой envt - Win7, SQL05/08, VS2010) – ChrisA

+0

Спасибо, Джо! – Alex

+0

@Alex: Эта техника работала для вас? –

3

Найдено решение вашей проблемы here

Решение: Явное установить свойство ProviderArchitecture к архитектуре целевой SQL Server.

Если вы не указали явное свойство ProviderArchitecture, оно будет предполагать выполнение текущего процесса. Если хост-процесс вашего приложения не соответствует архитектуре установленной версии SQL Server на целевом сервере, коллекция ServerInstances будет пуста. Это связано с отдельными поставщиками WMI x86 и x64 и тем, как SQL Server регистрирует экземпляры.

Try 
    Dim objManagedComputer As New ManagedComputer("target_servername") 
    objManagedComputer.ConnectionSettings.ProviderArchitecture = ProviderArchitecture.Use64bit 
    Dim objServerInstance As ServerInstance 
    For Each objServerInstance In objManagedComputer.ServerInstances 
    MsgBox(objServerInstance.Name) 
    Next 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 
+0

Я знаю, что я не могу сказать «спасибо» на SO ... но на самом деле ... большое спасибо за это! :) – rauland

Смежные вопросы