最好将打开的SqlConnection作为参数传递,或在每个方法中调用一个新的?

问题描述 投票:16回答:2

如果要调用的方法/函数涉及需要打开的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..
}

我这样做是为了我:

  • 每个进程仅打开和关闭1个SqlConnection

但是,最好像这样构造我的代码:

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();
}

我看到的以这种方式进行构造的优势是:

  • 我不必为每个方法都传递一个额外的参数
  • 如果此行后面的方法不再具有SQL命令,则不会每次都调用未使用的参数

我看到的缺点是:

  • 如果myMethod是递归方法,则当它调用自身时将要打开另一个SqlConnection,依此类推,依此类推。
  • 如果btnSubmit正在调用都需要SqlConnection的多个方法,则每个方法都将打开和关闭一个新连接。

执行此操作的最佳方法是什么,最常用的是哪种方法?

c# sqlconnection
2个回答
17
投票

ADO.NET使用连接池,因此即使您认为要打开新的连接,它也会自动重用现有的打开的连接。考虑到这一点,实际上没有理由通过代码(作为参数)传递连接。这将使您的代码更加整洁,并具有与将连接作为参数传递时的性能相同的性能。

更多详细信息here

也(这确实很重要),请使用“ using”关键字。这样,您将不必处理关闭连接和清除操作,因为现在编写的代码无需处理关闭连接,因此在某些情况下,您可能最终会达到连接限制的目的。服务器。像这样去吧:

using(var connection = new SqlConnection(<connection_string>))
{
  connection.Open();
  using(var command = connection.CreateCommand())
  {

  }
}

如您所见,不需要调用connection.Close()或处理异常并在finally块中关闭连接,因为这是“ using”块的“工作”。

此外,还有一个重要说明...交易不会通过连接轮询传递,因此,如果您希望跨方法调用保持事务,则必须传递连接(这是我能想到的唯一原因。应该这样做)。


12
投票

最好使用的模式是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();
   }

 ....

}

这是我一直使用的。

某些人倾向于存储库拥有连接的简单方法。这比较简单,但是如果您需要跨多个存储库进行事务处理,它将无法正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.