我最近被放在一个现有的项目上,并试图减少重复代码的数量。
目前,有许多与数据库交互相关的方法。在每种方法中打开和关闭数据库连接。实质上,在每个方法中使用完全相同的代码来打开和关闭连接。
public static void AddToTable()
{
DbConnection con = Common.CreateConnection();
DbCommand cmd = con.CreateCommand();
//cmd.CommandText = SQL COMMAND GOES HERE
//cmd.ExecuteNonQuery();
con.Close();
}
我理解打开和关闭连接的重要性,但在每种方法中看到这些完全相同的代码行对我来说都很有趣。
C#是否有某种方法可以在方法启动时自动创建连接(在本例中为con和cmd变量),然后在方法完成时关闭连接?
答案 0 :(得分:2)
public static void AddToTable()
{
using( DbConnection con = Common.CreateConnection() )
{
DbCommand cmd = con.CreateCommand();
//cmd.CommandText = SQL COMMAND GOES HERE
//cmd.ExecuteNonQuery();
}
}
因为DBConnection在using
内,并且DbConnection实现了接口IDisposable
,所以一旦超出范围,就会执行连接.Dispose()
方法。
答案 1 :(得分:1)
你可以这样做:
using(var con = Common.CreateConnection())
{
using(var cmd = con.CreateCommand())
{
//cmd.CommandText = SQL COMMAND GOES HERE
//cmd.ExecuteNonQuery();
}
}
在关闭cmd
块后处理con
和using
对象时,这将自动关闭连接。它没有重构那些对象的创建,但老实说,无论如何都不应该重构。最好将这些对象完全保留在使用它们的方法范围内。当重复代码因为一个很好的理由而重复时,重复代码 (实际上,人们可以争辩说,这甚至不是重复的代码,因为它用于不同的商业目的。它只是重复击键 .Andy键入键入IDE不是软件开发的难点,维护其中的代码和抽象是。)
答案 2 :(得分:0)
如果方法正在进行数据库操作,那么如果没有这样的要求无限期地打开连接,则需要在同一方法本身中打开和关闭数据库连接。 如果您使用'使用'声明编译器将代码转换为try / finally阻止。
见下文,
using (SqlConnection sqlConn = new SqlConnection("connectionstring"))
{
sqlConn.Open();
}
编译器将如下转换此代码。
try
{
SqlConnection sqlConn = new SqlConnection("connectionstring");
sqlConn.Open();
}
finally
{
sqlConn.Close();
}
答案 3 :(得分:0)
除了using
块之外,还要考虑实体框架中使用的工作单元模式。主要思想是将应用程序数据库工作的一些逻辑部分选择到一个单元中,并为每个单元打开和关闭单个连接。您的方法称为AddToTable,因此我们可以假设使用一些具体的表数据,这些数据本身就是一组精华(此表中的行)。在这种情况下,一种可能的方法是将一个工作单元视为一组操作,在CRUD这样的表中具有单一的本质。 DB连接的生命周期是:open connection - CRUD single essence - close connection。
答案 4 :(得分:0)
您可以创建辅助方法以将可重复的代码移入其中。像
这样的东西public static void WithDB(Action<SqlConnection, DbCommand> action)
{
using(var con = Common.CreateConnection())
{
var cmd = con.CreateCommand();
action(con, cmd);
}
}
像这样使用
public static void AddToTable()
{
WithDB((con, cmd)=>
{
//cmd.CommandText = SQL COMMAND GOES HERE
//cmd.ExecuteNonQuery();
});
}
答案 5 :(得分:0)
Lambda 是你的朋友....(实际上只是花了时间重构 400 多个 using 语句,所以只有一个地方创建了 sqlcommand(并且它是一个 using 语句)