在C#中,确定数据库是否已启动并运行的最佳方法是什么?

时间:2009-05-29 18:57:14

标签: c# .net database ado.net

我已经想出了以下方法来确定数据库是否正常运行。这会尝试打开数据库连接,如果失败,则返回false。

private static bool IsDatabaseConnectionUp(string connectionString)
{
    System.Data.SqlClient.SqlConnection conn = null;

    try
    {
        conn = new SqlConnection(connectionString);

        conn.Open();

        return conn.State == System.Data.ConnectionState.Open;
    }
    catch (SqlException)
    {
        // There was an error in opening the database so it is must not up.
        return false;
    }
    finally
    {
        if (conn != null)
        {
            if (conn.State == System.Data.ConnectionState.Open)
            {
                conn.Close();
            }

            conn.Dispose();
        }
    }
}

这是确定此数据库是否已启动的最佳方法吗?我不喜欢这种方法的原因是它将依赖于超时值,并且只要设置超时就会占用。

有更好的方法吗?

6 个答案:

答案 0 :(得分:2)

这实际上取决于您要确定的内容。如果您真的想确定“服务器是否正在运行,并且能够被访问”,那么我会说这很可能是最有效的方式。我这说的原因是服务器本身可能已启动,但它可能不接受连接,或者应用程序正在使用的连接可能无效(用户名/密码不正确)。

因此,鉴于此,超时是必需的,因为您要验证真正的连接。如果您只想查看服务器是否在那里,您可以尝试ping,但这只是告诉您设备是否处于活动状态,不一定是SQL Server完全启动并运行且可用。

答案 1 :(得分:2)

由于您专门查看SQLServer连接,请将连接字符串转换为SqlConnectionStringBuilder对象并更改超时值。

SqlConnectionStringBuilder csb = 
   new SqlConnectionStringBuilder(connectionString);
csb.ConnectTimeout = 5;
string newConnectionString = csb.ToString();

这样可以控制超时值。请记住,不要将它设置得太低或者你会得到误报。

答案 2 :(得分:1)

你的模式很接近但是有一个问题。因为SQLConnection实现了IDisposable,所以在返回之前你真的应该处理你的测试连接。

try
    {
        using (System.Data.SqlClient.SqlConnection conn = new SqlConnection(connectionString))
        {

            conn.Open();

            return conn.State == System.Data.ConnectionState.Open;
        }
    }
    catch (SqlException)
    {
        // There was an error in opening the database so it is must not up.
        return false;
    }

关于其他海报所说的内容,如果您只想查看数据库实例是否正在运行,您可以枚举系统上的进程,或使用命令行访问来测试数据库,但要么这些选项完全取决于数据库供应商。对于大多数应用程序,您的方法通常都可以。

答案 3 :(得分:0)

如果您对该特定数据库(不是整个数据库服务器)的状态感兴趣,那么是的,这将是最好的方式。

答案 4 :(得分:0)

如果您担心超时,可以尝试一些事情......

您可以尝试ping服务器。除非不允许使用ICMP数据包,否则会更快地告诉您服务器是否已关闭。如果无法ping通,则无法连接。显然,不能保证你可以连接,但是当你不能连接时它会更快。

您可以使用不同的连接字符串进行服务器连接测试。您通常不需要完整的默认时间来建立连接,因此您可能会大幅降低它。

如果您可以允许稍微陈旧的数据,您可以拥有一个服务,每X分钟(5或10或其他)检查连接,然后询问该服务以获取最新信息。这更像是Witness的行为。

答案 5 :(得分:0)

这可能是一个简化的代码段,但你不应该有conn.Dispose()或using(...){...}语句吗?

编辑:没关系,我看到了评论。