Как проверить наличие базы данных
У меня есть следующий код для проверки соединения с БД, он периодически запускается для проверки доступности БД:
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()
{
}
}