J'utilise le code suivant pour répertorier toutes les instances de serveur SQL distantes et locales: exécutant le code sur ma machine locale. Le code peut trouver et répertorier une instance SQL Server Express (version 9.0.5000) installée mais n'a pas réussi à répertorier l'autre instance SQL Server (version 10.0.1600). P> J'ai fait beaucoup de recherches sur Internet et assurez-vous que (1) le navigateur SQL est en cours d'exécution et (2) le port UDP 1434 est ouvert. P> Tout le monde sait pourquoi? Merci. P> p>
4 Réponses :
Vous sautez sur des serveurs qui ne sont pas nommés instances. Modifiez votre code:
public class SqlServerInstance { public string ServerInstance { get; set; } public string Version { get; set; } } public static List<SqlServerInstance> LocateSqlInstances() { List<SqlServerInstance> results = new List<SqlServerInstance>(); using (DataTable sqlSources = SqlDataSourceEnumerator.Instance.GetDataSources()) { foreach (DataRow source in sqlSources.Rows) { string servername; string instancename = source["InstanceName"].ToString(); if (!string.IsNullOrEmpty(instancename)) { servername = source["ServerName"].ToString() + '\\' + instancename; } else { servername = source["ServerName"].ToString(); } results.Add(new SqlServerInstance (){ ServerInstance = servername, Version = source["Version"].ToString() }); } } return results; }
Plusieurs sources disent que vous devez faire 2 appels vers refs: p> sqldatasourceenumerator.instance.getdataSources () code> ... p>
Merci beaucoup à Mitch pour la grande réponse qu'il met ensemble. Cependant, ce que j'ai fini par faire est comme ce qui suit:
J'ai deux méthodes distinctes pour obtenir une instance de serveur local et distant respectivement. Les instances locales sont extraites du registre. Vous devez rechercher à la fois des ruches WOW64 et WOW3264 pour obtenir à la fois SQL Server 2008 (64 bits) et SQL Server Express (32 bits) P>
Voici le code que j'utilise: p> à la fin, je viens de fusionner la liste d'instances distante et la liste d'instances locales pour produire le résultat final. P> P>
Le Studio Visual ne reconnaît pas la fonction: FormatLocalSQlinStannames (Ref Instances64bit); FormatLocalSQlinStannames (Ref Instances 32bit);
Que font "FormatLocalSQlinSancensannames"? Pouvez-vous s'il vous plaît poster le code?
Quelques personnes ont besoin de savoir sur les méthodes de GetDataSources et SqldataSourceenumerator. Si le nom d'instance est la valeur par défaut - InstanceCename sera vide! [Pourquoi .. Je ne sais pas, pourquoi ne puis-je pas spécifier Verbose, je ne sais pas que le gars de MS qui l'a écrit ... Arrrgh] P>
ServerName: Nom du serveur. P>
InstanceCename: Nom de l'instance de serveur. est clustered indique si le serveur fait partie d'un cluster. P>
version version du serveur (8.00.x pour SQL Server 2000 et 9.00.x pour SQL Server 2005). P>
var registryViewArray = new[] { RegistryView.Registry32, RegistryView.Registry64 }; foreach (var registryView in registryViewArray) { using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView)) using (var key = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server")) { var instances = (string[]) key?.GetValue("InstalledInstances"); if (instances != null) { foreach (var element in instances) { if (element == "MSSQLSERVER") Console.WriteLine(System.Environment.MachineName); else Console.WriteLine(System.Environment.MachineName + @"\" + element); } } } } Console.ReadKey();