2013-12-17 24 views
6

Na mojej aplikacji potrzebuję połączyć się z bazą klientów (SqlServer) tylko, aby sprawdzić, czy możemy się połączyć. To są moje ciągi połączeń z web.config (wartości nie są w ten sposób, Ive zmienił OD użytkownika i pwd)Połączenie w bazie danych klientów zawiesza się aplikacji

<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) 

ale ten kawałek kodu wisi cały mój wniosek (kiedy mówię, że zawiesza się, mam na myśli to, że nie pozwala mojej aplikacji na połączenie się z naszym DB). Jestem otwierając go na Default.aspx na razie obciążenie:

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: Problemem nie jest to, czy mogę połączyć się z serwerem lub nie, problem jest: kiedy jestem próbuje połączyć się, że db moja strona asp.net zamrożone do nowych wniosków na stronie inni

+4

Dobrze połowu wyjątek w ten sposób jest bardzo zły ćwiczyć. Skąd wiesz, jaki błąd rzuca na ciebie próba połączenia? – Steve

+0

Zaloguj się do wyjątku, który przechwytujesz - będą pewne informacje, dlaczego nie możesz połączyć się z bazą danych. – RePierre

+0

przy tej metodzie zakładam, że: jeśli rzuci jakiś wyjątek, to nie mógłbym się połączyć ... ale to nie wydaje się problemem, który wskazałem na moje pytanie, przepraszam, jestem niegrzeczny. –

Odpowiedz

5

nie trzeba, aby sprawdzić ConnectionState

Jeśli połączenie nie może zostać otwarty an exception is throw

może to sprawdzenie jest przyczyną Twojego problemu

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

spróbować obniżyć connection timeout w związku ciąg:

<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

nadal wisi ... = ( –

+0

@ Marciano.Andrade obniżenie limitu czasu połączenia – giammin

+0

Cant, ponieważ mamy jakieś kosztowne zapytania w tym DB ... lub to jest tylko czas oczekiwania na CONNECT? –

4

można spróbować przenieść połączenie do Task i używać Wait funkcji z limitu czasu, coś w tym

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

Poszedłem! Potrzebuję więcej testów, ale zadziałało! :) –

+0

Ale działa tylko dlatego, że ustawiam limit czasu, na timeoutie to wciąż zawiesza aplikację ... Ale to miłe obejście. –

+0

@ Marciano.Andrade, tak, tutaj możesz określić tylko maksymalny czas, który wciąż zawiesza – Grundy