ConnectionState枚举 - 确定数据库状态

时间:2015-05-07 15:36:47

标签: c# sql .net database

我正在尝试编写一个后台进程来检查数据库是否已损坏,我对于究竟会构成什么而感到困惑,因为"已经破坏了#34;。

查看在Microsoft开发人员网络上发现here的官方文档,其中有一个成员名为"已损坏"。该成员在什么时候会产生真实,或者它将如何使用?

目前我正在检查数据库是否损坏:

    public bool DatabaseConnection()
    {
        bool statusUp = true;

        using (var databaseConnection = new SqlConnection(ConfigData.ConnectionStrings.DatabaseConnectionString))
        {
            try
            {
                databaseConnection.Open()       
            }
            catch (SqlException ex)
            {
                const string message = "Could not establish a connection with Database.";
                Log.DatabaseStatusDown(message, ex);
                statusUp = false; 
            }
            finally { databaseConnection.Close(); }
        }

        return statusUp
    }

我知道Using语句利用了IDisposable类,连接将被处理,但我更加偏执。这有效吗?如果没有,那么确定我的连接是否被破坏的更有效的方法是做这样的事情吗?

public bool DatabaseConnection()
{
    using (var databaseConnection = new SqlConnection(ConfigData.ConnectionStrings.DatabaseConnectionString))
    {
        return databaseConnection.State == ConnectionState.Broken;
    }
}

我将每两分钟运行一次这个过程,有些事情告诉我,我概述的第一种方法效率不高。第二种方法是否可以确定我的数据库是否坏了?微软为这个特定的枚举确定了什么?

3 个答案:

答案 0 :(得分:1)

不是专家,但我认为已损坏会表明已连接的数据库连接存在无法恢复的连接问题(服务器已将其关闭等)。它不会非常可靠,然后可能只有在尝试做某事失败后才能检测到。

答案 1 :(得分:1)

检查刚刚建立的连接上的Broken是没有意义的。它仅对长期连接有用 - 它基本上会告诉您重新打开连接。

它不会告诉您有关数据库状态或数据库服务器的任何信息。它告诉你的唯一事情是具体的连接是否有效。

如果您始终在创建新连接,那么您唯一关心的是connection.Open是否会抛出异常。当然,ExecuteXXX方法等 - 连接可以在任何时候丢失。

答案 2 :(得分:1)

我不会使用ConnectionState.Broken。它是reserved for future use

第一种技术实际上非常轻巧。它只是从连接池获取连接,该连接池在本地保存。处置连接将返回到池的连接以供其他进程使用。

我可能会考虑实际向SQL Server发送命令,例如"选择' ping'"或轻量级的东西。如果您没有获得结果集,则表明您的SQL Server无论出于何种原因都无法为该请求提供服务。