2013-12-17 29 views
6

在我的应用程序上,我只需要连接到客户端数据库(SqlServer),以查看我们是否可以连接。 这些都是从我的web.config中的连接字符串(该值是不是这样的,从来就更改了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的加载事件:

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:问题不在于我是否可以连接到服务器或没有,问题是:当我正尝试连接到DB我的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