Anda melewatkan server yang tidak bernama instance. Ubah kode Anda:
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;
}
Harap Catatan:SqlDataSourceEnumerator.Instance.GetDataSources()
memiliki kekurangan:
- Tunduk pada aturan firewall (TCP/IP 1433 dan UDP 1434 yang Diblokir)
- Tidak menemukan SQL Server jika SQL Browser mati
- Tidak menemukan SQL Server jika disembunyikan
- Isi daftar tidak dijamin dapat diulang (karena batas waktu). Bahkan, panggilan berikutnya sangat mungkin untuk memberikan daftar yang berbeda tergantung pada jaringan I/O, kinerja server, jumlah server pada jaringan dan kendala tergantung waktu lainnya
Beberapa sumber mengatakan Anda harus melakukan 2 panggilan ke SqlDataSourceEnumerator.Instance.GetDataSources()
...
Referensi:
- SqlDataSourceEnumerator.Instance; tidak mengembalikan semua instance
- EnumAvailableSqlServers atau SqlDataSourceEnumerator - Daftar Database yang tersedia salah
- Menghitung Server SQL
- Mencantumkan Server SQL secara Terprogram