3

在我的Windows 窗体应用程序(启动时)中,我使用 ping 命令检查 Internet 连接和我的SQL Server是否都处于活动状态。

在 .NET 框架 2.0 中,我应该使用任何“更好”的方式命令来完成上述任务吗?

4

6 回答 6

7

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

于 2009-10-15T09:25:30.903 回答
2

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

如果您的服务器配置为提供 SNMP,则最好选择获取 SNMP 信息以了解您的服务器是否可运行。

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

于 2009-10-15T09:24:05.193 回答
2

这是一个示例代码:

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;
        }

来源:我自己的博客

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

于 2009-10-15T09:47:52.127 回答
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 版本的代码中修改。

更新:mattcodes 提出了一个关于连接池的好观点,根据MSDN

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

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

如果这还不够,Pooling=false请在连接字符串中进行设置以确保。

于 2009-10-15T10:02:23.023 回答
0

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

于 2009-10-15T09:29:44.373 回答
0

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

还有一点,我已经看到了这一点,其中数据库服务器的问题是服务器上的时间。即选择GetDate()

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

于 2009-10-15T16:29:51.850 回答