使用Microsoft应用程序块进行数据访问时,DataReader.Close()方法是否关闭连接对象?

时间:2011-06-29 05:11:28

标签: ado.net datareader

我正在审核使用Microsoft Application Blocks for Data Access与数据库交互的应用程序。应用程序调用一个函数并将查询传递给它。该函数使用数据访问应用程序块(对于给定的查询)创建DataReader对象,并将DataReader返回给调用者。

应用程序在完成后关闭DataReader对象。我的问题是,关闭DataReader对象是否会自动关闭底层连接对象。我不清楚数据访问应用程序块是否使用“CommandBehavior.CloseConnection”标志打开命令对象。

问题:

  1. 在DataReader对象上调用Close()方法时,它是否还关闭基础连接对象(使用Microsoft应用程序块创建DataReader - Database.ExecuteReader()方法
  2. 如果没有,在完成数据读取后,确保释放连接的建议方法是什么?
  3. 提前致谢

3 个答案:

答案 0 :(得分:2)

http://msdn.microsoft.com/en-us/library/system.data.commandbehavior.aspx

CloseConnection:执行该命令时,关闭关联的DataReader对象时关闭关联的Connection对象。

答案 1 :(得分:1)

Miguel Angel Utiel的回答是对的,如果你使用“CommandBehavior.CloseConnection”,连接将在阅读器关闭后关闭。就像这样:

 OracleDataReader odr = oc.ExecuteReader(CommandBehavior.CloseConnection);
 odr.Close();
 if (oc.Connection.State == System.Data.ConnectionState.Closed) {
    System.Diagnostics.Debug.WriteLine("connection is closed");
 }

如果您的ExecuteReader()没有参数,就像

一样
OracleDataReader odr = oc.ExecuteReader();
odr.Close();
if (oc.Connection.State != System.Data.ConnectionState.Closed) {
    System.Diagnostics.Debug.WriteLine("connection is openning");
}

读:http://msdn.microsoft.com/en-us/library/system.data.commandbehavior.aspx

答案 2 :(得分:0)

手动关闭和处理对象始终是一个好习惯。 GC最终会收集它们,但你不知道何时以及何时处理数据库时你不希望打开连接,这会耗尽资源。

所以回答你的问题:

1)是的,DataReader.Close()将关闭连接。这在处理任何连接对象时都是相关的。

  

一旦您关闭阅读器,它就会使用它所连接的连接   自动关闭。因为读者是连接对象   (需要打开连接才能正常运行),你无法关闭   完成阅读器之前的连接。   http://p2p.wrox.com/book-beginning-asp-net-1-0/11037-sqldatareader-close-connection.html

另请参阅:http://msdn.microsoft.com/en-us/magazine/cc188705.aspx

2)我建议将连接放在using语句中: **这些是使用常规SQLClient对象完成的,但它们将适用于从System.Data.Common.DbCommant,System.Data.Common.DbConnection等类继承的所有对象。

using(SqlConnection con = new SqlConnection(....))
{
   //blah blah blah
   con.close();
}

将在使用结束时调用Dispose,它将调用close,但我仍然想隐式调用它。

或者,您可以将它放在try / catch语句中:

SQLConnection con = new SqlConnection(...);
try
{
  con.open();
}
catch(Exception ex)
{
}
finally
{
   //depending on the version of .NET you might want to do:
   //if(con.State != System.Data.ConnectionState.Closed)
   //    con.Close();
   con.close();
}