2010-08-28 8 views
2

J'essaie d'énumérer toutes les instances SQL Server installées sur une machine locale. J'utilise SmoApplication.EnumAvailableSqlServers (true). Toutefois, seules les instances SQL Server Express 2005 sont affichées. L'instance 2008 par défaut n'est pas affichée du tout!Smo n'affiche pas les instances SQL Server 2008 lorsque des instances 2005 existent

J'ai essayé 2 autres solutions avec SqlServerRegistrations.EnumRegisteredServers() et SqlDataSourceEnumerator.Instance.GetDataSources() mais elles ne fonctionnent pas non plus.

Il y a une autre question à ce sujet (Can't enumerate SQL Server 2008 Registered Servers with SMO) mais elle n'a malheureusement pas de réponse.

+0

J'ai un problème très semblable - ma question est à l'adresse: http://stackoverflow.com/questions/3592401/smoapplication-enumavailablesqlservers-fails-to-return-all-servers Dans mon cas , il s'agit de l'instance SQL 2005 par défaut non retournée et de l'instance SQL08 nommée. Bizarrement, j'ai remarqué que l'arrêt du service SQL Browser permet de détecter l'instance SQL05 par défaut, mais l'instance SQL08 nommée n'est pas retournée. J'aimerais beaucoup que quelqu'un fasse la lumière sur ça aussi !! – ChrisA

+0

Chris, j'ai fait une solution de contournement dans mon application - d'ailleurs de cette façon, j'essaie d'ouvrir la connexion à l'instance par défaut manuellement et voir si elle a été ouverte avec succès. Il semble que les moyens habituels de Microsoft ne fonctionnent pas tous. – Alex

Répondre

1

Voici une autre alternative que vous pourriez essayer d'utiliser le ManagedComputer Class (Namespace: Microsoft.SqlServer.Management.Smo.Wmi).

ManagedComputer mc = new ManagedComputer(); 

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

J'ai essayé cela - hier comme il arrive - et il ne retourne aucun cas !! Si vous avez une idée pourquoi, s'il vous plaît faites le moi savoir! (Mon environnement est Win7, SQL05/08, VS2010) – ChrisA

+0

Merci, Joe! – Alex

+0

@Alex: Cette technique a-t-elle fonctionné pour vous? –

3

trouvé la solution à votre problème here

Solution: EXPLICITEMENT la propriété ProviderArchitecture à l'architecture de la cible SQL Server.

Si vous ne définissez pas explicitement la propriété ProviderArchitecture, elle assumera celle du processus en cours d'exécution. Si le processus hôte de votre application ne correspond pas à l'architecture de la version installée de SQL Server sur le serveur cible, la collection ServerInstances sera vide. Cela est dû aux fournisseurs WMI x86 et x64 distincts et à la manière dont SQL Server enregistre les instances.

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

Je sais que je ne suis pas supposé dire "merci" sur SO ... mais vraiment ... merci beaucoup pour cela! :) – rauland

Questions connexes