这是问题所在。用户可以输入数据库的服务器名称和连接字符串。 如果无法访问服务器(错误的地址,防火墙或任何其他问题),我希望尽快了解这一点。
如果我正在使用sqlConnection并尝试连接到不可访问的服务器,这需要很长时间(我认为超过1分钟!)。这与连接超时btw无关,因此设置此属性将无济于事。
我的想法是首先尝试ping服务器,如果我得到响应(这意味着服务器可以从应用程序访问),那么继续使用sqlConnection。如果ping没有响应,则中止操作并正确通知用户。
有没有更好的方法呢?任何想法都会受到欢迎。
忘了指出,我正在使用NHibernate所以我不能使用任何MSSQL特定的库。此外,目标服务器可以将Linux作为操作系统,而不仅仅是Windows。
答案 0 :(得分:4)
这个previous question's answer has a decent approach更优雅,只有ping,使用WMI将为您提供更多信息
答案 1 :(得分:1)
我认为值得注意的是,检查通用数据库的存在性和可访问性的唯一真正好方法是访问它。例如,一台机器可配置一个完美运行的数据库,并拒绝ping。同样,计算机可以运行数据库实例,并配置为忽略/拒绝所有WMI查询。如果您可以为您的环境假设这些不正确(即,您知道您的所有公司机器将始终回答ping),那么您可以继续;否则,你可能不得不采取“尝试连接”命中。
答案 2 :(得分:1)
是否可以使用SqlDataSourceEnumerator获取包含所有可用SQLServer的DataTable,然后根据列表检查用户输入。像这样的东西。 See MSDN.
System.Data.DataTable table = VisibleServerList.GetVisibleServers();
public static class VisibleServerList
{
public static System.Data.DataTable GetVisibleServers()
{
System.Data.Sql.SqlDataSourceEnumerator instance = System.Data.Sql.SqlDataSourceEnumerator.Instance;
return instance.GetDataSources();
}
}
答案 3 :(得分:0)
创建与服务器的连接时,将连接超时设置为2或3秒。这样,如果服务器实际上不存在,它将更快地纾困。
唯一的缺点是,如果服务器确实存在,而且它正在受到重创,那么你可能会得到假阴性。但这很少成为问题。
答案 4 :(得分:0)
最后,我决定采用混合方法。当用户点击“连接”按钮时,将在用户输入的服务器上执行ping操作。如果服务器没有响应(可以非常快速地检测到),用户将收到服务器似乎无法访问的消息,以及是否要继续尝试连接到该服务器的问题。
基本上,用户将决定他将等待“尝试连接”。
答案 5 :(得分:0)
您可以使用TcpClient类查询服务器并检查特定端口是否打开,可能是这样的:
using System.Net;
using System.Net.Sockets;
public bool CheckServerAvailablity(string serverIPAddress, int port)
{
try
{
IPHostEntry ipHostEntry = Dns.Resolve(serverIPAddress);
IPAddress ipAddress = ipHostEntry.AddressList[0];
TcpClient TcpClient = new TcpClient();
TcpClient.Connect(ipAddress , port);
TcpClient.Close();
return true;
}
catch
{
return false;
}
}