我该怎么用而不是ping?

时间:2009-10-15 09:21:24

标签: sql-server vb.net winforms internet-connection

在我的Windows Forms应用程序中(启动时),我使用ping命令检查Internet连接和我的SQL Server是否还活着。

我是否应该使用“更好”的方法命令来完成.NET framework 2.0中的上述任务?

6 个答案:

答案 0 :(得分:7)

只需向SQL服务器发出一个小而简单的请求,以查看连接是否有效。除此之外,如果你的连接超时或以其他方式失败,为什么不只是一个明智的处理例外?

答案 1 :(得分:2)

Ping只能用于验证数据包是否可以传送到目的地,但不适合检查实际服务器是否正常运行。

如果您的服务器配置为提供SNMP,那么获取SNMP信息以了解您的服务器是否正常运行将是更好的选择。

但是,编程SNMP并不是一项简单的任务。如果你真的需要这些好处,那就去吧。

答案 2 :(得分:1)

以下是示例代码:

private bool IsInternetAvailable()
        {
            bool ret = false;

            try
            {
                HttpWebRequest req = (HttpWebRequest)
            HttpWebRequest.Create("http://www.yourremoteserver.com/");
                HttpWebResponse res 
            = (HttpWebResponse)req.GetResponse();
                if (res.StatusCode == HttpStatusCode.OK)
                {
                    ret = true;
                }
                else
                {
                    ret = false;
                }
                res.Close();
            }
            catch
            {
                ret = false;
            }

            return ret;
        }

来源:my own blog

对于SQL Server,最好“尝试连接”。

答案 3 :(得分:1)

在不执行命令的情况下检查网络和MS-SQL Server:

// Setup a timer to call as needed
public bool IsSqlConnectionOpen(string connectionString)
{
    bool open = false;
    using (var connection = new SqlConnection(connectionString))
    {
        try
        {
            connection.Open();
            open = true;
            connection.Close();
        }
        catch (SqlException e)
        {
            // log e.ToString()
        }
    }
    return open;
}

从用于获取SQL Server版本的代码修改。

更新:根据MSDN

,mattcodes提出了关于连接池的一个好处
  

发生致命错误(例如故障转移)时,池会自动清除。

     

当请求SqlConnection对象时,如果可用的连接可用,则从池中获取它。要使用,连接必须是未使用的,具有匹配的事务上下文或与任何事务上下文无关,并且具有到服务器的有效链接。

如果这还不够,请在connection string中设置Pooling=false以确定。

答案 4 :(得分:0)

测试互联网连接。 System.Net具有许多有用的功能。 HttpWebRequest函数将尝试加载网站,您将获得用于测试连接的详细响应。

答案 5 :(得分:0)

要非常小心地将其作为启动逻辑。我已经看到这样的事情堕落到心跳逻辑,这有很多其他有趣的问题。其中之一是,如果你的应用程序将有许多正在运行的实例。如果您的应用程序在大型环境中使用,并且可能有数千个实例在运行,那么心跳逻辑可以添加到网络和服务器负载。或者有时心跳间隔是可配置的,有人将其设置为零或其他一些疯狂的值。

还有一点,我已经看到这个结合在一起,问到DB服务器的问题是它在服务器上的时间。即选择GetDate()

这有两件事,首先你知道服务器和网络正在运行,如果你得到答案。其次,如果您有一些时间关键操作,则可以测量客户端计算机和数据库服务器之间的时钟偏差。有时这一点很重要。