数据读取器连接状态

时间:2011-12-15 17:20:29

标签: c# sql-server

我正在使用C#SQL Server 2008。

在DataReader(ADO.Net)中,可以一次获取一个记录,并且连接保持打开状态,直到获取所有记录。

混淆是,从存储过程中,我们发送完整的表。

因此,当sql server发送了所有记录时,为什么连接仍然打开。我的意思是这背后的机制是什么。

5 个答案:

答案 0 :(得分:3)

SQL Server不只是“发送”记录......然后客户端必须逐个读取它们。它是一个特殊的无关紧要。返回结果集,并在客户端完成之前进行读取。

答案 1 :(得分:1)

您必须在数据阅读器上调用close方法,如果您已完成此操作,我建议您也将其处理掉。我经常在关闭连接时这样做,因为我知道如果我不再需要连接,那么我将不再需要读者。

例如:

 m_oleDatabaseDataReader.Close();
 m_oleDatabaseDataReader.Dispose();

答案 2 :(得分:1)

数据库将通过某种流发送结果。这个的确切细节是抽象的,所以高一层的代码不需要关心它是网络流,命名管道还是别的东西,但它是某种流。

沿着流移动东西需要时间。从世界另一端的计算机沿着网络流移动大量记录集200万行的时间远远超过同一台计算机上内存流中的一行记录集,但无论如何都是时间。

.Next()不会等待所有数据遇到,而是会读取足够的字节来构建下一行数据。可能这些数据已经位于内存缓冲区中,因为它已从流中读取,这可能意味着等待数据通过连接。

当你在一个庞大的记录集上调用.Next() 3次并使用结果时,仍然可以通过线路传输数据,所以你可以看到这对于将所有内容都变为好尽可能高效。此时,也许存储过程仍然有效,但很可能它已经完成,数据库本身已经完成了查询,但处理连接的部分仍然有一个充满结果的缓冲区要发送。

之后,连接仍然会打开。它将一直打开,直到你关闭它(无论是明确地还是到达using块的末尾)。您可以使用其他查询再次使用它。

关闭SqlConnection对象后,与数据库的实际连接可能仍然打开,因为汇集这些连接通常比每次创建新连接便宜。 https://stackoverflow.com/a/3845924/400547更多地解释了这一部分。

答案 3 :(得分:0)

DataReader不会自动关闭,您需要在datareader对象上调用close。

答案 4 :(得分:-1)

//never assume always check if != null
if(m_oleDatabaseReader != null)
{  
   ((IDisposable)m_oleDatabaseReader).Dispose();
}