我已为现有应用程序创建嵌入式监控,这些应用程序同时使用Entity Framework
和ADO
。我必须检查连接字符串是否良好,我实际上是这样做的:
if (c.ConnectionString.Contains("metadata"))
{
using (var connection = new EntityConnection(c.ConnectionString))
{
try
{
connection.Open();
isWorking = true;
connection.Close();
}
catch (EntityException)
{
// Le catch n'a pas de raison d'être, la variable étant à false par défaut
}
}
}
else
{
using (var connection = new SqlConnection(c.ConnectionString))
{
try
{
connection.Open();
isWorking = true;
connection.Close();
}
catch (SqlException)
{
// Le catch n'a pas de raison d'être, la variable étant à false par défaut
}
}
}
但我有很多冗余。我怎样才能开发这个东西,只有一次尝试捕获而不是Entity
SQL
的一个?
实际使用connections strings
System.Configuration.ConfigurationManager.ConnectionStrings
谢谢。
答案 0 :(得分:3)
EntityConnection和SqlConnection都继承自DbConnection作为它们的共同祖先,因此您可以编写一个函数,只需要一个DbConnection实例,并将其余代码留下来相同。
public bool CheckConnection(DbConnection connection)
{
try
{
connection.Open();
connection.Close();
return true;
}
catch (Exception)
{
// Le catch n'a pas de raison d'être, la variable étant à false par défaut.
}
return false;
}
然后,您可以使用相同的逻辑调用您的代码:
if (c.ConnectionString.Contains("metadata"))
{
using (var connection = new EntityConnection(c.ConnectionString))
{
isWorking = CheckConnection(connection);
}
}
else
{
using (var connection = new SqlConnection(c.ConnectionString))
{
isWorking = CheckConnection(connection);
}
}
这只是一个简单的重构,使用您已经拥有的内容而不改变代码的逻辑。
如果您不想捕获一般异常(在我看来在这种情况下完全没问题),C#6提供了一个新的构造,以允许更一般地捕获某些异常:
catch (Exception ex) when (ex is EntityException || ex is SqlException)
{
// exception handling code
}
此外,如果if ... else
语句中没有其他逻辑,则可以使用单个使用块:
if (c.ConnectionString.Contains("metadata"))
{
connection = new EntityConnection(c.ConnectionString);
}
else
{
connection = new SqlConnection(c.ConnectionString);
}
using (connection)
{
// same as before.
}
接下来的逻辑步骤是制作某种提取和创建不同连接的工厂类/方法。
答案 1 :(得分:2)
由于两者都来自DbConnection
,您可以这样做:
using(DbConnection connection = c.ConnectionString.Contains("metadata") ?
new EntityConnection(c.ConnectionString) as DbConnection: new SqlConnection(c.ConnectionString) as DbConnection)
{
try
{
connection.Open();
isWorking = true;
connection.Close();
}
catch (Exception e) //make this more generic
{
//Do something
}
}
通过使用DbConnection
(而不是单独的连接),您可以测试您的连接。