【问题标题】:How to test connection string?如何测试连接字符串?
【发布时间】:2017-05-02 10:32:49
【问题描述】:

我有一个简单的问题,我正在尝试检查App.config 中的连接字符串是否有效以及其中的服务器和数据库是否可以访问。我已经尝试了以下代码,但仍然无法正常工作:-

public static bool checkConnectionString(string con)
{
    if (ConfigurationManager.ConnectionStrings[con].ConnectionString == "" && !checkConnectionStringValidity(con))
    {
        return false;
    }
    else
    {
        return true;
    }
}

public static bool checkConnectionStringValidity(string con)
{
   try {
        using(var connection = new SqlConnection(con)) {
            connection.Open();
            return true;
        }
    } catch {
        return false;
    }
}

然后我在主界面使用上面的方法:-

if (Data.checkConnectionString("Utilities"))
{
    Application.Run(new Log_In());
}
else 
{
    Application.Run(new ApplicationMainSettings());  
}

我希望当我在app.config 中写入错误信息时,程序会将我引导至ApplicationMainSettings() 屏幕。

【问题讨论】:

  • 不应该传入实际的连接字符串吗? ... !checkConnectionStringValidity(ConfigurationManager.ConnectionStrings[con].ConnectionString))
  • 您对 checkConnectionStringValidity 的调用未传递实际的连接字符串。
  • 问之前好像没调试过。您只是从方法中解析了字符串,而不是从 App.config 中解析。编辑:帕特里克和西蒙已经指出了这一点
  • 是的,我错了,但是,当我传递真正的连接字符串时,什么都没有发生......!

标签: c# connection-string


【解决方案1】:

您的方法看起来很好并且工作正常,问题是 if 中的 && 运算符,由于它的存在,方法 checkConnectionStringValidity 只有在连接字符串为 "" 时才会调用我的事情不需要检查""这里可以直接使用如下:

if(checkConnectionStringValidity(ConfigurationManager.Connecti‌​onStrings[con].Conne‌​ctionString))
{
    // Proceed the connection is valid
}
else
{
    // Stop here the connection is invalid
}

否则您可以尝试使用!= "" && checkConnectionStringValidity(con),这样只有在连接字符串非空时才会调用该方法(因为如果值为空,该方法肯定会返回false)。所以你可以这样尝试:

if (ConfigurationManager.ConnectionStrings[con].ConnectionString != "" && checkConnectionStringValidity(con))
{
    // Proceed the connection is valid
}
else
{
    // Stop here the connection is invalid
}

【讨论】:

  • 或者更改||中的&&
  • @Steve:那太好了但没必要,如果它为空意味着该方法将返回false。我已经更新了帖子\
【解决方案2】:

重构代码以应用预期的逻辑...

public static bool checkConnectionString(string key) {
    var connectionSetting = ConfigurationManager.ConnectionStrings[key];
    return connectionSetting != null && checkConnectionStringValidity(connectionSetting.ConnectionString);
}

我们首先检查连接设置是否确实存在。

如果是,那么您可以检查连接字符串。

如果没有,那么您就有机会获得空异常。

【讨论】:

  • @Medo 我看到了我犯错的地方。使用了错误的方法。我的错。
【解决方案3】:

你可以试试这个解决方案。

public static bool checkConnectionStringValidity(string con)
{
var _testConnection=false;
try {
        using(var connection = new SqlConnection(con)) {
        if (con.State == ConnectionState.Closed)
        {
            con.Open();
            _testConnection = true;
            con.Close();
        }
    }
} catch {
    _testConnection = false;
}
return _testConnection ;

}

您还需要按以下方式更改 checkConnectionString 函数。

public static bool checkConnectionString(string con)
{
if(ConfigurationManager.ConnectionStrings[con] !=null)
{
  if (Convert.Tostring( ConfigurationManager.ConnectionStrings[con].ConnectionString) == "" && !checkConnectionStringValidity(con)
  { 
    return false;
  }
  else
  {
     return true;
  }
}
else 
{
     return false;
}
}

如果您有任何疑问,请告诉我。

【讨论】:

  • 请分享您在哪个函数中返回 false 的详细信息?
最近更新 更多