SQL Server 允許應用程式在目前網路中尋找 SQL Server 實例。 類別 SqlDataSourceEnumerator 會將這項資訊公開給應用程式開發人員,並提供 DataTable 包含所有可見伺服器的相關信息。 這個傳回的數據表包含網路上可用的伺服器實例清單,與用戶嘗試建立新連線時所提供的清單相符,並展開下拉式清單,其中包含 [ 連接屬性 ] 對話框上所有可用的伺服器。 所顯示的結果不一定會完成。
備註
和大多數 Windows 服務一樣,最好以最少的許可權執行 SQL Browser 服務。
擷取列舉器實例
若要擷取包含可用 SQL Server 實例相關信息的數據表,您必須先使用共用/靜態 Instance 屬性來擷取列舉值:
Dim instance As System.Data.Sql.SqlDataSourceEnumerator = _
System.Data.Sql.SqlDataSourceEnumerator.Instance
System.Data.Sql.SqlDataSourceEnumerator instance =
System.Data.Sql.SqlDataSourceEnumerator.Instance
擷取靜態實例後,您可以呼叫 GetDataSources 方法,該方法將傳回一個包含可用伺服器訊息的 DataTable。
Dim dataTable As System.Data.DataTable = instance.GetDataSources()
System.Data.DataTable dataTable = instance.GetDataSources();
從方法呼叫傳回的數據表包含下列數據行,這些數據行都包含 string 值:
| 資料行 | 說明 |
|---|---|
| ServerName | 伺服器的名稱。 |
| InstanceName | 伺服器實例的名稱。 如果伺服器以預設實例的形式執行,則為空白。 |
| IsClustered | 指出伺服器是否為叢集的一部分。 |
| 版本 | 伺服器的版本。 例如: - 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) |
列舉限制
所有可用的伺服器都可能或可能不會列出。 清單可能會因逾時和網路流量等因素而有所不同。 這可能會導致清單在連續兩次呼叫時不同。 只會列出相同網路上的伺服器。 廣播封包通常不會周遊路由器,這就是為什麼您可能看不到列出的伺服器,但它會在呼叫之間穩定。
列出的伺服器可能或可能沒有其他資訊,例如 IsClustered 和 版本。 這取決於取得清單的方式。 透過 SQL Server 瀏覽器服務列出的伺服器會比透過 Windows 基礎結構找到的伺服器擁有更多詳細數據,而 Windows 基礎結構只會列出名稱。
備註
伺服器列舉只有在完全信任環境中執行時才可用。 在部分信任環境中執行的元件將無法使用它,即使它們具有 SqlClientPermission 程式碼存取安全性 (CAS) 許可權也一樣。
SQL Server 會透過使用名為 SQL Browser 的外部 Windows 服務,提供 SqlDataSourceEnumerator 的相關資訊。 此服務預設為啟用,但系統管理員可能會將其關閉或停用,讓此類別看不到伺服器實例。
範例
下列主控台應用程式會擷取所有可見 SQL Server 實例的相關信息,並在控制台視窗中顯示資訊。
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("============================");
}
}
}
另請參閱
- SQL Server and ADO.NET (SQL Server 和 ADO.NET)
- ADO.NET 概觀