【问题标题】:correct point to close a data reader in vb.net在 vb.net 中关闭数据读取器的正确点
【发布时间】:2023-03-03 03:20:02
【问题描述】:

我在 vb.net 中有这段代码:

reader = myCommand.ExecuteReader
If reader.HasRows Then
    While reader.read

    End While
End If

我应该在End While 之后还是End If 之后使用 reader.close

【问题讨论】:

  • 我宁愿说在End If 之后处理你的myCommand 或使用Using

标签: vb.net


【解决方案1】:

最好的方法是使用Using-statement,它确保非托管资源被释放(即使出错)。这也会关闭阅读器。

Using reader = myCommand.ExecuteReader()
   If reader.HasRows Then
      While reader.read

      End While
    End If 
End Using

Is it necessary to manually close and dispose of SqlDataReader?

【讨论】:

    【解决方案2】:

    .Close 的放置位置没有区别。更重要的是确保你处理命令对象(你应该处理任何实现IDisposable的对象。从你发布的代码中不清楚你是否这样做。

    最简单的方法是将其包装在 using 块中

    如果您查看example on MSDN。这是他们使用的模式:

       Using connection As New SqlConnection(connectionString)
            Dim command As New SqlCommand(queryString, connection)
            connection.Open()
    
            Dim reader As SqlDataReader = command.ExecuteReader()
    
            ' Call Read before accessing data.
            While reader.Read()
    
            End While
    
            ' Call Close when done reading.
            reader.Close()
        End Using
    

    但由于SqlDataReader 也实现了IDisposable - 所以最好也将阅读器包装在using 块中。

    using 块的末尾,reader 已关闭为您处理,这意味着您不必担心:

        Using connection As New SqlConnection(connectionString)
            Dim command As New SqlCommand(queryString, connection)
            connection.Open()
    
            Using reader As SqlDataReader = command.ExecuteReader()
                While reader.Read()
    
                End While
            End Using
    
        End Using
    

    请注意,您不需要检查 reader.HasRows 是否存在,因为如果没有行,reader.Read 将返回 False。有关详细信息,请参阅此答案:Should if call SqlDataReader.HasRows if I am calling SqlReader.Read

    【讨论】:

      【解决方案3】:

      另一种方法是

      Try
          reader = myCommand.ExecuteReader
          If reader.HasRows Then
              While reader.read
      
              End While
          End If
      Catch ex as Exception
      Finally
          reader.Close()
      End Try
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-25
        • 2016-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        相关资源
        最近更新 更多