Langue

Énumération d’instances de SQL Server (ADO.NET)

SQL Server permet aux applications de trouver des instances dans le réseau actuel. La SqlDataSourceEnumerator classe retourne les serveurs visibles dans l’objet DataTable . Le tableau répertorie les instances de serveur disponibles sur le réseau, comme la liste des serveurs dans la boîte de dialogue Propriétés de connexion. Les résultats ne sont pas toujours complets.

Avec Microsoft.Data.SqlClient, GetDataSources nécessite Windows avec prise en charge réseau native. Sur Linux, macOS ou Windows avec la mise en réseau managée activée, la méthode lève NotImplementedException. Dans ces environnements, spécifiez l’adresse et le port du serveur directement dans votre chaîne de connexion au lieu de la découverte du serveur.

Remarque

Comme pour la plupart des services Windows, il est préférable d’exécuter le service SQL Browser avec le moins de privilèges possible.

Extraction d'une instance d'énumérateur

Pour récupérer des informations sur les instances de SQL Server disponibles, commencez par récupérer un énumérateur avec la propriété partagée/statique Instance :

Dim instance As Microsoft.Data.Sql.SqlDataSourceEnumerator = _
   Microsoft.Data.Sql.SqlDataSourceEnumerator.Instance
Microsoft.Data.Sql.SqlDataSourceEnumerator instance =
   Microsoft.Data.Sql.SqlDataSourceEnumerator.Instance;

Après avoir récupéré l’instance statique, appelez GetDataSources pour récupérer des informations sur les serveurs disponibles dans l’objet DataTable :

Dim dataTable As System.Data.DataTable = instance.GetDataSources()
System.Data.DataTable dataTable = instance.GetDataSources();

La table retournée par l’appel de méthode contient les colonnes suivantes, qui contiennent toutes des valeurs de string :

Colonne Descriptif
ServerName Nom du serveur.
InstanceName Nom de l'instance du serveur. Vide si le serveur s’exécute en tant qu’instance par défaut.
IsClustered Indique si SQL Server fait partie ou non d'un cluster.
Version Version du serveur. Par exemple:

- 9.00.x (SQL Server 2005)
- 10.0.xx (SQL Server 2008)
- 10.50.x (SQL Server 2008 R2)
- 11.0.xx (SQL Server 2012)

Limitations de l’énumération

Tous les serveurs disponibles peuvent être ou non répertoriés. La liste peut varier en fonction de facteurs tels que les délais d’expiration et le trafic. Cela peut entraîner la liste à être différente lors de deux appels consécutifs. Seuls les serveurs sur le même réseau sont répertoriés. En général, les paquets diffusés ne traversent pas les routeurs, ce qui explique pourquoi vous ne voyez pas de serveur répertorié, mais il sera stable entre les appels.

Les serveurs répertoriés peuvent ou non avoir des informations supplémentaires comme IsClustered et version. Cela dépend de la façon dont la liste a été obtenue. Les serveurs listés à l’aide du service de navigateur de SQL Server offrent plus de détails que ceux trouvés par le biais de l’infrastructure Windows, qui n’indique que le nom.

Remarque

Le .NET moderne ne prend pas en charge la sécurité de l'accès au code ou l'exécution en confiance partielle. Pour la découverte du serveur, autorisez le trafic réseau SQL Server Browser requis.

SQL Server fournit des informations par le SqlDataSourceEnumerator biais du service Windows externe SQL Browser. Ce service est activé par défaut, mais les administrateurs peuvent l’arrêter ou le désactiver, ce qui rend l’instance de serveur invisible à cette classe.

Exemple :

L’application console suivante récupère des informations sur les instances de SQL Server visibles et affiche les informations dans la fenêtre de console. Installez le package NuGet Microsoft.Data.SqlClient.

Imports Microsoft.Data.Sql
Imports System.Data

Module Module1
  Sub Main()
    ' Retrieve the enumerator instance and then the data.
    Dim instance As SqlDataSourceEnumerator = _
     SqlDataSourceEnumerator.Instance
    Dim table As System.Data.DataTable = instance.GetDataSources()

    ' Display the contents of the table.
    DisplayData(table)

    Console.WriteLine("Press any key to continue.")
    Console.ReadKey()
  End Sub

  Private Sub DisplayData(ByVal table As DataTable)
    For Each row As DataRow In table.Rows
      For Each col As DataColumn In table.Columns
        Console.WriteLine("{0} = {1}", col.ColumnName, row(col))
      Next
      Console.WriteLine("============================")
    Next
  End Sub
End Module
using Microsoft.Data.Sql;

class Program
{
  static void Main()
  {
    // Retrieve the enumerator instance and then the data.
    SqlDataSourceEnumerator instance =
      SqlDataSourceEnumerator.Instance;
    System.Data.DataTable table = instance.GetDataSources();

    // Display the contents of the table.
    DisplayData(table);

    Console.WriteLine("Press any key to continue.");
    Console.ReadKey();
  }

  private static void DisplayData(System.Data.DataTable table)
  {
    foreach (System.Data.DataRow row in table.Rows)
    {
      foreach (System.Data.DataColumn col in table.Columns)
      {
        Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
      }
      Console.WriteLine("============================");
    }
  }
}

Voir aussi