2010-04-08 4 views
8

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

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

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

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

+0

Почему вы хотите избежать исключения? – CResults

ответ

12

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

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

Это, как говорится, вы можете проверить текущее состояние , проверив свойство State.

2

написать расширение следующим образом:

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... 
    } 
} 

HTH.

+0

Хороший ответ, но чувак, вы выбрасываете исключение – CResults

+0

@CResults: в блоке catch не существует ДРОГО в методе расширения, эффективно использующем это исключение. Я предпочитаю, чтобы это исключение было брошено, но ОП упомянул, что ему не нужен бросок исключения, проверяя, можно ли открыть соединение, следовательно, мое решение. – Sunny

+0

Забота об этом решении, _SqlConnection.Open() _ получит соединение из пула, если пул доступен. Тогда _State_ будет _Open_, даже если соединение повреждено (например, канал TCP). И тогда исключение будет возбуждено только при выполнении команды. Обходной путь заключается в использовании _Connection.ChangeDatabase (Connection.Database); _, чтобы проверить, доступно ли соединение. – JoeBilly

3

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

0

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

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 подключение возможно 9/10 вы должны знать, если что-то сервер SQL. Это избавит вас от неприятного использования памяти исключения, которое я ставлю на то, что вы действительно после.

+0

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx – Arian

0

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

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

0

Вы не можете избежать исключения при подключении базы данных, но есть функция, которая справляется с этим очень хорошо. Я использую эту функцию, которая возвращает 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; 
    }