【问题标题】:Data Reader connection state [closed]数据读取器连接状态[关闭]
【发布时间】:2012-01-21 09:13:36
【问题描述】:

我正在使用 C# SQL Server 2008。

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

困惑是,我们从存储过程中发送了完整的表。

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

【问题讨论】:

  • 打开的连接不会影响返回或获取的记录,打开的连接或多或少会减少往返次数或每次都必须创建一个新的连接实例并 open() 它这样做时会出现性能问题..也许您可以发布一个示例,说明您必须更好地了解您的问题是什么.. DataReader 也是正向阅读,但如果您愿意,您还可以创建一个 RecordSet,填充对象, 并迭代 // 我个人更喜欢 datareader
  • 当然,打开的连接会影响获取的记录。尝试中途关闭连接,看看调用.Next() 会得到什么!当谈到让它们打开多长时间时,这不是唯一的考虑因素,但这是一个考虑因素,也是询问者所问的问题。

标签: c# sql-server


【解决方案1】:

SQL Server 不只是“发送”记录……然后客户端必须一一读取它们。它是一个存储过程并不重要。返回一个结果集,并一直被读取,直到客户端完成。

【讨论】:

    【解决方案2】:

    数据库将通过某种流发送结果。对此的确切细节进行了抽象,因此更高一层的代码不需要关心它是网络流、命名管道还是其他东西,但它是某种流。

    沿着溪流移动东西需要时间。从世界另一端的计算机沿着网络流移动包含 200 万行的大量记录集比从同一台计算机上的内存流中移动一行的记录集要多得多,但无论哪种方式都需要时间。

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

    当您在一个庞大的记录集上调用了 3 次 .Next() 并利用了结果时,仍然可能有数据通过网络传输,因此您可以看到这对于使一切都像可能的。此时,存储过程可能还在工作,但很可能它已经完成并且数据库本身已经完成了查询,但它处理连接的部分仍然有一个充满结果的缓冲区要发送。

    在那之后,连接仍然会打开。它将一直打开,直到您关闭它(无论是明确地还是通过 using 块的末尾)。您可以在另一个查询中再次使用它。

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

    【讨论】:

      【解决方案3】:

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

      例如:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:
          //never assume always check if != null
          if(m_oleDatabaseReader != null)
          {  
             ((IDisposable)m_oleDatabaseReader).Dispose();
          }
          

          【讨论】:

          • 这不是对所提问题的回答。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-15
          • 1970-01-01
          • 2017-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多