2013-12-17 4 views
6

В моем приложении мне нужно подключиться в базе данных клиента (SqlServer) только для того, чтобы узнать, можем ли мы подключиться. Это мои соединения строки из web.config (значения не тот путь, I've изменил IP-адрес, имя пользователя и PWD)Соединение в базе данных клиента зависает приложение

<add name="ConnectionStringLibracom" connectionString="Data Source=192.168.1.45\SqlServer2008;Initial Catalog=xxx;user=xxx;pwd=xxx;Application Name=MES" 
     providerName="System.Data.SqlClient" /> (MINE) 
<add name="ConnectionStringMigplus" connectionString="Data Source=999.99.999.99;Initial Catalog=xxx;user=xxx;pwd=xxx" 
      providerName="System.Data.SqlClient" /> (CLIENT) 

, но этот кусок кода висит все мое приложение (когда я говорю, что он зависает, я имею в виду, что он не позволяет моему приложению подключаться к нашей БД). I'm его выполнения в Default.aspx на событие Load:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!TestaIntegracaoErpMigplus()) 
    { 
     lblMensagemIntegracao.Visible = true; 
     Session["Integracao"] = false; 
    } 
    else 
     Session["Integracao"] = true; 
} 

protected static bool TestaIntegracaoErpMigplus() 
{ 
    string connectionStringMigplus = WebConfigurationManager.ConnectionStrings["ConnectionStringMigplus"].ConnectionString; 
    bool ret = false; 

    using (SqlConnection Conn = new SqlConnection(connectionStringMigplus)) 
    { 
     try 
     { 
      Conn.Open(); 
      if (Conn.State == ConnectionState.Open) 
      { 
       ret = true; 
      } 
     } 
     catch (SqlException) 
     { 
      ret = false; 
     } 
    } 

    return ret; 
} 

@EDIT: Проблема не в том, могу ли я подключиться к серверу или нет, проблема: когда я пытаюсь подключиться к этому дб мой сайт asp.net заморожен на новые запросы на странице другие

+4

Ну уловившее исключения в этом пути действительно плохо практика. Как вы узнаете, какую ошибку пытается совершить попытка подключения? – Steve

+0

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

+0

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

ответ

5

вам не нужно, чтобы проверить ConnectionState

Если соединение не может быть открыт an exception is throw

может быть, эта проверка вызывает ваш вопрос

protected static bool TestaIntegracaoErpMigplus() 
{ 
    bool ret = true;  

    try 
    { 
     string connectionStringMigplus = WebConfigurationManager.ConnectionStrings["ConnectionStringMigplus"].ConnectionString; 
     using (SqlConnection Conn = new SqlConnection(connectionStringMigplus)) 
     { 
      Conn.Open(); 
     } 
    } 
    catch (Exception) 
    { 
     ret = false; 
    } 
    return ret; 
} 

------------- UPDATE ------------------

Попробуйте понизить connection timeout в связи строка:

<add name="ConnectionStringMigplus" connectionString="Data Source=999.99.999.99;Initial Catalog=xxx;user=xxx;pwd=xxx;Connection Timeout=5" providerName="System.Data.SqlClient" /> 
+0

все еще висит ... = ( –

+0

@ Marciano.Andrade ниже тайм-аут соединения – giammin

+0

Невозможно, потому что у нас есть дорогие запросы на эту БД ... или это просто тайм-аут, чтобы ПОДКЛЮЧИТЬ? –

4

Вы можете попробовать переместить подключение к Task и использовать Wait функции с тайм-аутом, что-то вроде этого

protected static bool TestaIntegracaoErpMigplus() 
{ 
    string connectionStringMigplus = WebConfigurationManager.ConnectionStrings["ConnectionStringMigplus"].ConnectionString; 
    var task = Task.Factory.StartNew<bool>(()=>{ 
     bool ret = true; 
     using (SqlConnection Conn = new SqlConnection(connectionStringMigplus)) 
     { 
      try 
      { 
       Conn.Open(); 
      } 
      catch (SqlException) 
      { 
       ret = false; 
      } 
     } 

     return ret; 
    }); 

    if(task.Wait(/*your timeout in milliseconds*/)){ 
     return task.Result; 
    } 

    return false; 
} 
+0

Работало! Нужно провести еще несколько тестов, но это сработало! :) –

+0

Но это работает только потому, что я установил таймаут, в таймаут время он все еще висит приложение ... Но это хороший способ обхода. –

+0

@ Marciano.Andrade, да, здесь вы можете указать только максимальное время, которое оно по-прежнему висит – Grundy

Смежные вопросы