【问题标题】:Should I close the SQL connection before looping through the reader?我应该在循环阅读器之前关闭 SQL 连接吗?
【发布时间】:2019-12-20 19:15:32
【问题描述】:

我想知道最佳做法是什么以及为什么。找不到任何可以清楚说明优点和缺点的内容。

仅供参考...我正在使用 .Net

哪个更好?

  • 打开一个 SQLConnection
  • 使用数据读取器执行我的 SQL
  • 遍历结果
  • 让我的 using 语句关闭阅读器
  • 使用 using 语句关闭连接

  • 打开一个 SQLConnection
  • 使用数据读取器执行我的 SQL
  • 使用 using 语句关闭连接
  • 遍历结果
  • 关闭阅读器

我对第二个的想法是,如果您的结果集很大,那么您保持连接打开的时间不会超过应有的时间。这是正确的,这就是我想要做的。

编辑

我有类似的东西。

using sq as new sqlconnection
   >>connection and sproc stuff<<
   using rd as new sqlreader
        while rd.read
            do some work
        end while
    end using
end using

这样做也很有效

dim rd as datareader
using sq as new sqlconnection
   >>connection and sproc stuff<<
   rd = sq.executereader
end using

while rd.read
   do work
end while

【问题讨论】:

  • 您是否尝试在阅读器打开的同时关闭连接?阅读器正在读取(流式传输)连接的结果。
  • 这不是我的经验。我的测试显示关闭/处理连接会关闭活动阅读器。 “阅读器关闭时调用 Read 的尝试无效。”
  • 我会说第一个选项。获取所有数据后让 Using 关闭阅读器,然后关闭与 using 块的连接。
  • 您的代码中有些地方不匹配。我刚刚做了第二个块(查询只是SELECT 1,不需要从服务器上的磁盘读取任何内容)并且连接上的end using仍然将rd.IsClosed更改为True,导致异常.我什至在 VB 而不是 C# 中做到这一点,以防 VB 在 using 块的范围内做一些奇怪的事情(官方技术术语)。无论如何,在使用阅读器之前关闭连接的共识结果是“不要”,即使它似乎工作(对你来说)。
  • 为了彻底,我现在已经测试了关闭连接,然后在数据读取器上使用System.Data.SqlClientMicrosoft.Data.SqlClientOracle.ManagedDataAccessNpgsqlSystem.Data.SQLite 调用ReadMicrosoft.Data.SqliteMySql.DataMySqlConnector。异常消息各不相同,Npgsql 一直等到调用Get* 方法之一才抛出它,但结果始终是异常。

标签: c# .net sql-server vb.net


【解决方案1】:

加载一个 DataTable,然后关闭并处理您的连接。您可以在没有打开连接的情况下使用数据。您的第二个代码块将不起作用。

Private Sub OpCode()
    Dim dt As New DataTable
    Using cn As New SqlConnection("Your connection string"),
            cmd As New SqlCommand("Select * From SomeTable;")
        cn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using 'Command and Connection are closed and disposed
    For Each row In dt.Rows
        'Do work here
    Next
End Sub

【讨论】:

  • 对选择 * 投反对票。您正在教授 OP 糟糕的编码实践。
  • @allmhuran 哇!也许6个月前我不知道更好。我也不知道他想要的字段的名称。使用 * 可能会获得额外的不需要的字段,但不会像不使用参数那样损坏数据库。感谢您的提醒。 :-)
【解决方案2】:

您的第一个选项更好。 您完成读取数据后关闭连接。原因是 SQLDataReader 对象不会从查询中读取所有数据。如果您正在查询大量数据,它将对数据进行分页并仅加载当时需要的内容。如果您在完成循环数据集之前关闭连接,您将产生其他人指出的错误。有关详细信息,请参阅 2 年前的 this 帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多