Тестирование соединения SQL без исключения - PullRequest
8 голосов
/ 08 апреля 2010

Чтобы проверить, могу ли я подключиться к своей базе данных, я выполняю следующий код:

using (SqlConnection connection = new SqlConnection(myConnectionString))
{
   try
   {
      connection.Open();
      canConnect = true;
   }
   catch (SqlException) { }
}

Это работает, за исключением того, что выдает исключение, если соединение не удалось. Есть ли другой способ проверить соединение Sql, которое не вызывает исключение?

Редактировать: Чтобы повысить точность, я спрашиваю, существует ли простой метод, который делает это без необходимости открывать соединение и перехватывать исключения, которые могут возникнуть

Ответы [ 6 ]

12 голосов
/ 08 апреля 2010

При попытке открыть соединение, невозможно избежать исключения, если соединение не может быть открыто. Его можно где-то спрятать в функции, но вы получите исключение, несмотря ни на что.

Это было разработано так, потому что обычно вы ожидаете, что сможете подключиться к базе данных. Неудачное соединение - исключение .

При этом вы можете проверить текущее состояние соединения в любое время, проверив свойство State.

3 голосов
/ 08 апреля 2010

Если выдается исключение, и вы обрабатываете его в блоке перехвата, вы уже знаете, что соединение не установлено. Я думаю, что вы ответили на свой вопрос.

3 голосов
/ 08 апреля 2010

написать расширение так:

public static class Extension{
 public static bool CanOpen(this SqlConnection connection){
   try{
    if(connection == null){ return false; }

    connection.Open();
    var canOpen = connection.State == ConnectionState.Open;
    connection.close();
    return canOpen;
 }
 catch{
  return false;
 }
}

Тогда вы можете потреблять его как:

 using(var connection = new SqlConnection(myConnectionString)){
      if(connection.CanOpen()){
       // NOTE: The connection is not open at this point...
       // You can either open it here or not close it in the extension method...
       // I prefer opening the connection explicitly here...
     }
}

НТН.

0 голосов
/ 14 июня 2013

Вы не можете избежать возникновения исключений при подключении к базе данных, но есть некоторые функции, которые справляются с этим очень хорошо. Я использую эту функцию, которая возвращает true, если соединение существует.

    public static bool IsSQLConnectionAvailable()
    {
        SqlConnection _objConn = new SqlConnection();

        try
        {
            _objConn.ConnectionString = ConfigurationManager.ConnectionStrings["DefaultSQLConnectionString"].ConnectionString;
            _objConn.Open();
        }
        catch
        {
            return false;
        }
        finally
        {
            if (_objConn.State == ConnectionState.Open)
                _objConn.Close();
        }

        return true;
    }
0 голосов
/ 11 октября 2012

Вы всегда можете использовать класс ConnectionStringBuilder и проверять наличие каждого элемента, который требуется для строки подключения, прежде чем пытаться открыть его.

Если строка подключения верна, но сервер базы данных, к которому вы подключаетесь, не работает, вы все равно получите исключение. Было бы бессмысленно проверять качество строки, если конечная точка, к которой вы подключаетесь, потенциально может быть отключена.

0 голосов
/ 08 августа 2011

Я думаю, что реальный ответ здесь - пинг.

string data = "ismyserverpingable";
byte[] buffer = Encoding.ASCII.GetBytes (data);
int timeout = 120;
PingReply reply = pingSender.Send ("google.com", timeout, buffer, options);
if (reply.Status == IPStatus.Success)
{
}

Если вы явно не проверяете, возможно ли подключение к SQL Server 9/10, вам следует знать, является ли что-то сервером SQL. Это избавит вас от неприятного использования памяти исключением, которое, как я держу пари, вам действительно нужно.

...