Jac*_*ian 5 ado.net datareader
我正在审查一个使用 Microsoft 应用程序块进行数据访问与数据库交互的应用程序。应用程序调用一个函数并向其中传递一个查询。该函数使用数据访问应用程序块(对于给定的查询)创建一个 DataReader 对象,并将 DataReader 返回给调用者。
应用程序完成后关闭 DataReader 对象。我的问题是,关闭 DataReader 对象是否会自动关闭底层连接对象。我不清楚数据访问应用程序块是否使用“CommandBehavior.CloseConnection”标志打开命令对象。
问题:
提前致谢
手动关闭和处置物品始终是一个好习惯。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)