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

Jac*_*ian 5 ado.net datareader

我正在审查一个使用 Microsoft 应用程序块进行数据访问与数据库交互的应用程序。应用程序调用一个函数并向其中传递一个查询。该函数使用数据访问应用程序块(对于给定的查询)创建一个 DataReader 对象,并将 DataReader 返回给调用者。

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

问题:

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

提前致谢

Rya*_*ier 1

手动关闭和处置物品始终是一个好习惯。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();
}
Run Code Online (Sandbox Code Playgroud)

dispose会在using结束时调用,这会调用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();
}
Run Code Online (Sandbox Code Playgroud)