Как проверить наличие базы данных

У меня есть следующий код для проверки соединения с БД, он периодически запускается для проверки доступности БД:

private bool CheckDbConn()
{
   SqlConnection conn = null;
   bool result = true;

   try
   {
       conn = DBConnection.getNewCon();
       ConnectionState conState = conn.State;

       if (conState == ConnectionState.Closed || conState == ConnectionState.Broken)
       {
          logger.Warn(LogTopicEnum.Agent, "Connection failed in DB connection test on CheckDBConnection");
          return false;
       }             
   }
   catch (Exception ex)
   {
      logger.Warn(LogTopicEnum.Agent, "Error in DB connection test on CheckDBConnection", ex);
      return false; // any error is considered as db connection error for now
   }
   finally
   {
      try
      {
         if (conn != null)
         {
            conn.Close();
         }
      }
      catch (Exception ex)
      {
         logger.Warn(LogTopicEnum.Agent, "Error closing connection on CheckDBConnection", ex);
         result = false;
      }
   }
   return result;
}

и

static public SqlConnection getNewCon()
{
    SqlConnection newCon = new SqlConnection();
    newCon.ConnectionString = DBConnection.ConnectionString; // m_con.ConnectionString;
    newCon.Open();
    return newCon;
}

Мой вопрос: будет ли это работать как ожидалось?

В частности, я заинтересован в тестировании ConnectionState. Возможно ли, что состояние будет: соединение (поскольку Open() является синхронным)?

Что мне делать в этом случае?

Заранее спасибо, Омер

Ответы

Ответ 1

Вы можете попробовать это.

    public bool IsServerConnected()
    {
        using (var l_oConnection = new SqlConnection(DBConnection.ConnectionString))
        {
            try
            {
                l_oConnection.Open();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
        }
    }

Ответ 2

SqlConnection будет бросать SqlException, когда он не может подключиться к серверу.

public static class SqlExtensions
{
    public static bool IsAvailable(this SqlConnection connection)
    {
        try
        {
            connection.Open();
            connection.Close();
        }
        catch(SqlException)
        {
            return false;
        }

        return true;
    }
}

Использование:

using(SqlConnection connection = GetConnection())
{
    if(connection.IsAvailable())
    {
        // Success
    }
}

Ответ 3

Ваш код кажется прекрасным, но вам действительно нужно использовать шаблон IDisposable и другое соглашение об именах:

private bool CheckDbConnection(string connectionString)
{
    try
    {
        using(var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            return true;
        }
    }
    catch (Exception ex)
    {
        logger.Warn(LogTopicEnum.Agent, "Error in DB connection test on CheckDBConnection", ex);
        return false; // any error is considered as db connection error for now
    }
}

И connection.Close() не должен бросать. Просто используйте блок using, и все в порядке.

Не нужно проверять состояние Close, так как вы только что открыли его.
Подробнее о состоянии Broken:

Разбито Соединение с источником данных нарушено. Это может произойти только после того, как соединение было открыто. Соединение в этом состоянии могут быть закрыты, а затем снова открыты. (Это значение зарезервировано для будущего версии продукта.)

Так что, действительно, не нужно проверять это.

Состояние Connecting может быть уловлено, если вы находитесь в многопоточном контексте, и ваш экземпляр соединения является общим. Но это не ваше дело.

Ответ 4

Я не могу прокомментировать...

... также избегать ловить общие исключения "catch (Exception ex)" и попытаться поймать определенные исключения, такие как примеры выше "catch (SqlException ex)"

Ответ 5

На самом деле, в visual studio класс подключения имеет свойство sonnectionstate.

когда состояние соединения изменяется, событие changechange соединений имеет триггер.

вы можете проверить эту статью.

https://msdn.microsoft.com/en-us/library/aa326268(v=vs.71).aspx

Ответ 6

Я использовал решение @Ramesh Durai, но обнаружил, что по крайней мере в моей настройке (приложение вызывало/проверяло периодически после запуска приложения; используя .Net 3.5 с базой данных Sql Server 2012), что первый вызов IsConnected() после взятия базы данных офлайн возвращал true. Тем не менее, он ExecuteScalar() ожидаемое исключение в ExecuteScalar() ниже:

public bool IsConnected() {
    using (var conn = new SqlConnection(DBConnection.ConnectionString)) {
        using (var cmd = New SqlCommand("SELECT 1", conn)) {
            try {
                conn.Open();
                cmd.ExecuteScalar();
                return true;
            } catch (SqlException) {
                return false;
            }
        }
    }
}

Ответ 7

Этот код для Mysql.

public class Program
{
string connection = "SERVER=localhost; user id=root; password=; database=dbname";
private void Form1_Load(object sender, System.EventArgs e)
{
checkifconnected();
}

private void checkifconnected()
{
MySqlConnection connect = new MySqlConnection(connection);
try{
connect.Open();
MessageBox.Show("Database connected");
}
catch
{
MessageBox.Show("you are not connected to database");
}
}

public static void Main()
{

}
}