我正在审核使用Microsoft Application Blocks for Data Access与数据库交互的应用程序。应用程序调用一个函数并将查询传递给它。该函数使用数据访问应用程序块(对于给定的查询)创建DataReader对象,并将DataReader返回给调用者。
应用程序在完成后关闭DataReader对象。我的问题是,关闭DataReader对象是否会自动关闭底层连接对象。我不清楚数据访问应用程序块是否使用“CommandBehavior.CloseConnection”标志打开命令对象。
问题:
提前致谢
答案 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();
}