如果要调用的方法/函数涉及需要打开的SqlConnection,我将在调用函数的方法中将其打开。例如:
protected static void btnSubmit(){
conn.Open();
myMethod(someParam, conn);
conn.Close();
}
protected static void myMethod(object someParam, SqlConnection conn){
//Some SQL commands etc here..
}
我这样做是为了我:
但是,最好像这样构造我的代码:
protected static void btnSubmit(){
myMethod(someParam);
}
protected static void myMethod(object someParam){
SqlConnection conn = New SqlConnection(".....");
conn.Open();
//Some SQL commands etc here..
conn.Close();
}
我看到的以这种方式进行构造的优势是:
我看到的缺点是:
myMethod
是递归方法,则当它调用自身时将要打开另一个SqlConnection
,依此类推,依此类推。btnSubmit
正在调用都需要SqlConnection的多个方法,则每个方法都将打开和关闭一个新连接。执行此操作的最佳方法是什么,最常用的是哪种方法?
ADO.NET使用连接池,因此即使您认为要打开新的连接,它也会自动重用现有的打开的连接。考虑到这一点,实际上没有理由通过代码(作为参数)传递连接。这将使您的代码更加整洁,并具有与将连接作为参数传递时的性能相同的性能。
更多详细信息here
也(这确实很重要),请使用“ using”关键字。这样,您将不必处理关闭连接和清除操作,因为现在编写的代码无需处理关闭连接,因此在某些情况下,您可能最终会达到连接限制的目的。服务器。像这样去吧:
using(var connection = new SqlConnection(<connection_string>))
{
connection.Open();
using(var command = connection.CreateCommand())
{
}
}
如您所见,不需要调用connection.Close()或处理异常并在finally
块中关闭连接,因为这是“ using”块的“工作”。
此外,还有一个重要说明...交易不会通过连接轮询传递,因此,如果您希望跨方法调用保持事务,则必须传递连接(这是我能想到的唯一原因。应该这样做)。
最好使用的模式是Repository + UnitOfWork模式。
因此创建了存储库,并传递了包含连接的UnitOfWork。完成工作后,将销毁UnitOfWork。
// Pseudocode
using(UnitOfWork uow = new UnitOfWork())
{
Repository.Init(uow);
Repository.SaveInDb(stuff);
}
和工作单位:
// PseudoCode
class UnitOfWork : IDisposable
{
public UnitOfWork()
{
conn = new SqlConnection();
conn.Open();
}
public void Dispose()
{
conn.Close();
}
....
}
这是我一直使用的。
某些人倾向于存储库拥有连接的简单方法。这比较简单,但是如果您需要跨多个存储库进行事务处理,它将无法正常工作。