正确的方法来测试连接字符串

时间:2017-08-16 14:59:44

标签: c# sql

我在3个连接字符串的数组上尝试了这个代码而没有任何抱怨。我的问题是,是否可以在同一个对象上调用多个dispose调用?

foreach (var s in strings)
{
      connection.ConnectionString = s;
      connection.Open();
      connection.Close();
      connection.Dispose();
}

4 个答案:

答案 0 :(得分:1)

这是一种方法:

bool TestConnection<T>(string connectionString) where T : IDbConnection, new
{
    using(T con = new T())
    {
        con.ConnectionString = connectionString;
        connection.Open();
        return true;
    }
}

实现连接测试代码的另一种方法是使用扩展方法(注意这不会处理连接对象):

public static Tuple<bool, Exception> TestConnection(this IDbConnection connection)
{
    try
    {
        connection.Open();
        connection.Close();
        return new Tuple<bool, Exception>(true, null);
    }
    catch(Exception e)
    {
        return new Tuple<bool, Exception>(false, e);
    }
}

请注意,在这个版本中我返回了一个bool和Exception元组,所以无论谁使用这个代码,都可以获得有关连接失败原因的信息,但不必将调用包装在try ... catch块中。当然,您可以选择简单地返回bool,就像在第一个示例中一样,这仅用于演示目的。

答案 1 :(得分:0)

您应该以这种方式修改代码:

foreach (var s in strings)
{
      connection.ConnectionString = s;
      connection.Open();
      connection.Close();
}

连接不需要处理,或者至少你不得再处置想要再次使用的对象。

无论如何,这不是一个好方法。

你应该有一个

using(DbContext db = new DbContext()){
   //SQL Actions
}

为每个db相关代码,以避免问题^^

答案 2 :(得分:0)

public bool TestConnection(IDbConnection con)
        {
            using (con)
            {
                try
                {
                    con.Open();
                    con.Close();
                    return true;
                }
                catch
                {
                    return false;
                }
            }
        }

答案 3 :(得分:0)

它&#34; ok&#34;你正在做什么(每次完全不同的连接,没有运行查询),但正如艾米在评论中所说,它确实没有给你带来什么特别的东西。应该遵守不重复使用处置物的智慧。

同样对于SqlConnection,调用Close然后dispose是重复的,因为它会在dispose时调用它的close。

还要把我的代码放到混合中,代码注释:

    private bool DBValidCheck(string connection)
    {
        //Using statement releases the object that implement iDisposable once it exits the block. Takes care of the dispose
        using (var connection = new SqlConnection(connection))
        {
            try
            {
                connection.Open();
                return true;
            }
            catch
            {
                return false;
            }
        }
    }