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();