2009-09-14 103 views
9

我有以下ado.net代码,如果我已经使用使用来包装我的DBCommand,是否必须明确关闭底下的连接?dbCommand.Close()是否会关闭连接?

感谢,

 public static void ExecuteSQL(int Id) 
     { 
      Database db; 
      const string sqlCommand = "Stored Procedure Name"; 
      try 
      { 
       db = DatabaseFactory.CreateDatabase(); 
       using (DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand)) 
       { 
        db.AddInParameter(dbCommand, "p_Id", DbType.Int32, Id); 
        db.ExecuteNonQuery(dbCommand); 
**//do I have to close connection explicitely here??** 
        if (dbCommand.Connection.State != ConnectionState.Closed) 
        { 
         dbCommand.Connection.Close(); 
        } 
        dbCommand.Connection.Dispose(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Logger.Log.Error(ex.StackTrace, ex); 
       throw; 
      } 
     } 

回答

4

是的,如果你已经包裹在using块全部是DbCommand,那么你会明确关闭DbConnection,因为你目前在你的代码做。然而,只需拨打Dispose就足够了。您无需拨打CloseDispose

+0

我相信@Satya在这种情况下是正确的,你的回答实际上是不正确的。 – Coops 2014-06-27 13:40:19

+0

@CodeBlend:在有人使用企业库的情况下,是的,她的回答是正确的。但是,尽管代码确实引用类如“数据库”,但问题的内容和标记不引用EntLib。结果,如果人们正在寻找对问题的回答,那么这仍然是正确的。 – 2014-11-26 22:36:57

-1

不,你不知道。

一旦使用块的结尾被击中,就会为你调用dispose。

+2

我不知道为什么这是upvoted,因为它只是明显错误。你绝对必须关闭连接。这个问题是关于必须处理**连接**,而不是**命令**。 “单独使用”命令并不这样做。 – 2009-09-14 19:35:39

+0

基于他的代码中的评论,以及他明确调用dbCommand.Connection.Close和dbCommand.Connection.Dispose()的事实,他虽然问他是否需要,因为他已经将命令封装在使用块中。 如果他问他是否仍然需要调用类似db.Close和db.Dispose的东西,那么你是100%正确的。我只是不认为这是他的问题。 – cptScarlet 2009-09-14 19:56:12

+0

“如果我已经使用包装我的DBCommand,是否必须关闭*下面的连接*显式”这似乎很清楚措辞。 – 2009-09-14 22:39:35

2

http://www.willydev.net/descargas/WillyDev_EntLib_TestGuide.pdf

应用块使其与他们完成后关闭所述的数据库连接。例如,ExecuteNonQuery方法的实现包含using语句。 using语句获取资源,执行语句并处理资源。在这种情况下,资源是数据库连接。对于ExecuteReader方法,应用程序块在阅读器关闭后使用Command-Behavior.CloseConnection方法关闭连接。

+0

因此,这里标记为“答案”的回答完全错误? – Coops 2014-06-27 13:09:46

1

这篇文章很旧,但我回答说,如果我们在EnterpriseLibrary中使用这个块(在代码块中的类和方法名称让我思考这个问题),我肯定连接已经关闭。 提出问题和回答的人应明确考虑我们是否在讨论EnterbriseLibrary。 我测试了一个finally块,并且YES,在使用DbCommand块之后,连接会自动关闭。

+0

你可以发布代码,我想要一个例子来证明你说的是正确的,但我认为它是 – Coops 2014-06-27 13:14:45

相关问题