我在3个连接字符串的数组上尝试了这个代码而没有任何抱怨。我的问题是,是否可以在同一个对象上调用多个dispose调用?
foreach (var s in strings)
{
connection.ConnectionString = s;
connection.Open();
connection.Close();
connection.Dispose();
}
答案 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;
}
}
}