Enumerazione di istanze di SQL Server (ADO.NET)

Sia con SQL Server 2000 che con SQL Server 2005 alle applicazioni è consentito trovare istanze di SQL Server all'interno della rete corrente. Mediante la classe SqlDataSourceEnumerator queste informazioni vengono esposte allo sviluppatore dell'applicazione che in tal modo dispone di una DataTable contenente dati relativi a tutti i server visibili. Nella tabella restituita è incluso un elenco di istanze di server disponibili in rete che corrisponde all'elenco fornito quando un utente tenta di creare una nuova connessione ed espande l'elenco a discesa contenente tutti i server disponibili nella finestra di dialogo Proprietà connessione. I risultati visualizzati non sono sempre completi.

NotaNota

Come nel caso della maggior parte dei servizi Windows, è consigliabile eseguire il servizio Visualizzatore SQL con meno privilegi possibile.Per ulteriori informazioni sul servizio Visualizzatore SQL e su come gestirne il comportamento, vedere la documentazione online di SQL Server.

Recupero di un'istanza di enumeratore

Per recuperare la tabella che contiene le informazioni sulle istanze di SQL Server disponibili, è innanzitutto necessario recuperare un enumeratore utilizzando la proprietà condivisa/statica Instance:

Dim instance As System.Data.Sql.SqlDatSourceEnumerator = _
   System.Data.Sql.SqlDataSourceEnumerator.Instance
System.Data.Sql.SqlDataSourceEnumerator instance = 
   System.Data.Sql.SqlDataSourceEnumerator.Instance

Dopo aver recuperato l'istanza statica, è possibile chiamare il metodo GetDataSources, che restituisce un tipo DataTable contenente informazioni sui server disponibili:

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

La tabella restituita dalla chiamata al metodo contiene le seguenti colonne, tutte contenenti valori string:

Colonna

Descrizione

ServerName

Nome del server.

InstanceName

Nome dell'istanza del server. Resta vuoto se il server è in esecuzione come istanza predefinita.

IsClustered

Indica se il server è parte di un cluster.

Version

La versione del server (8.00.x per SQL Server 2000 e 9.00.x per SQL Server 2005).

Limitazioni delle enumerazioni

È possibile elencare o non elencare tutti i server disponibili. L'elenco può variare in base a fattori come i timeout e il traffico di rete. Pertanto l'elenco può risultare diverso durante due chiamate consecutive. Verranno elencati solo i server nella stessa rete. Normalmente i pacchetti di broadcast non passeranno dai router. Per questo motivo è possibile che l'utente non visualizzi un server elencato, ma tale server resterà stabile durante le chiamate.

Per i server elencati potrebbero essere disponibili anche informazioni aggiuntive quali IsClustered e la versione, a seconda del metodo con cui si è ottenuto l'elenco. I server elencati tramite il servizio Visualizzatore di SQL Server presenteranno maggiori dettagli rispetto a quelli rilevati tramite l'infrastruttura Windows, che consente di elencare solo i nomi.

NotaNota

L'enumerazione di server è disponibile solo in caso di attendibilità totale.Gli assembly eseguiti in un ambiente di attendibilità parziale non saranno in grado di utilizzare la funzionalità, anche se dispongono dell'autorizzazione CAS (Code Access Security, Sicurezza dall'accesso di codice) SqlClientPermission.

In SQL Server 2000 vengono offerte informazioni internamente per il tipo SqlDataSourceEnumerator. In SQL Server 2005, invece, vengono fornite informazioni tramite l'utilizzo di un servizio Windows esterno denominato Visualizzatore SQL. Questo servizio è abilitato per impostazione predefinita, ma gli amministratori possono disattivarlo o disabilitarlo per rendere l'istanza del server invisibile a questa classe. Il servizio si applica solo a SQL Server 2005 e non ha effetto sul comportamento di SQL Server 2000.

NotaNota

I componenti hardware o software possono limitare la capacità di ricerca di istanze di SQL Server.Per ulteriori informazioni sull'apertura di porte per la ricerca, vedere l'articolo della Knowledge Base How to use a script to programmatically open ports for SQL Server to use on systems that are running Windows XP Service Pack 2 (informazioni in lingua inglese).

Esempio

L'applicazione console riportata di seguito consente di recuperare informazioni su tutte le istanze di SQL Server visibili e di visualizzarle nella finestra della console.

Imports System.Data.Sql

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 System.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("============================");
    }
  }
}

Vedere anche

Altre risorse

SQL Server e ADO.NET