Bạn đang bỏ qua các máy chủ không phải là phiên bản được đặt tên. Sửa đổi mã của bạn:
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;
}
Xin lưu ý:SqlDataSourceEnumerator.Instance.GetDataSources()
có nhược điểm:
- Tuân theo quy tắc tường lửa (Chặn TCP / IP 1433 và UDP 1434)
- Không tìm thấy Máy chủ SQL nếu Trình duyệt SQL tắt
- Không tìm thấy Máy chủ SQL nếu chúng bị ẩn
- Liệt kê nội dung không được đảm bảo có thể lặp lại (do hết thời gian chờ). Trên thực tế, một cuộc gọi tiếp theo có khả năng đưa ra một danh sách khác tùy thuộc vào I / O mạng, hiệu suất máy chủ, số lượng máy chủ trên mạng và các ràng buộc phụ thuộc vào thời gian khác
Một số nguồn cho biết bạn phải thực hiện 2 cuộc gọi đến SqlDataSourceEnumerator.Instance.GetDataSources()
...
Giới thiệu:
- SqlDataSourceEnumerator.Instance; không trả lại tất cả các phiên bản
- EnumAvailableSqlServers hoặc SqlDataSourceEnumerator - Danh sách các Cơ sở dữ liệu có sẵn không chính xác
- Liệt kê Máy chủ SQL
- Máy chủ SQL lập danh sách theo chương trình