【问题标题】:Is it OK to use a DataReader after disposing the Command object?处理 Command 对象后可以使用 DataReader 吗?
【发布时间】:2014-10-08 02:42:39
【问题描述】:

我创建了一小类帮助方法来处理数据库。我想知道这种方法:

Shared Function GetReader(sql As String, con As OleDbConnection) As OleDbDataReader

   Dim cmd As New OleDbCommand(sql, con)
   Dim reader As OleDbDataReader = cmd.ExecuteReader
   cmd.Dispose()
   Return reader

End Function

我是否会遇到一些麻烦,先处理 Command 对象,然后再使用 DataReader?

我宁愿通过不一直创建/处理 Command 对象来保持调用代码的整洁(如果可以将其包含在上面的辅助方法中,这似乎是多余的)。

【问题讨论】:

  • 顺便说一句,从设计的角度来看,我并不太担心将 DataReader 返回给调用代码。辅助方法不会在低级数据库代码之外使用。 IE。数据访问层不会看到它们。

标签: .net vb.net datareader oledbdatareader


【解决方案1】:

我会在处理命令时遇到某种麻烦吗 先使用对象,然后使用 DataReader?

没有

但这是更简洁的代码:

Shared Function GetReader(sql As String, con As OleDbConnection) As OleDbDataReader

   Using cmd As New OleDbCommand(sql, con)
      Dim reader As OleDbDataReader = cmd.ExecuteReader
      'cmd.Dispose() 'Not needed here, will be invoked automatically
      Return reader
   End Using

End Function

旁注:

  • 考虑始终使用Using Statements 以确保所有资源都已释放

  • 考虑在不再需要连接和阅读器时将它们处理掉。并且不要害怕关闭然后重新打开连接,因为连接默认保存在池中,您应该尽快关闭它们 - 特别是如果您的应用程序处于某种形式的负载下 -

【讨论】:

    【解决方案2】:

    他们对这个 sn-p 没有任何问题,在执行 cmd.Dispose() 之前,您需要将查询结果分配给阅读器,即 Dim reader As OleDbDataReader = cmd.ExecuteReader,因此即使在处理 cmd 之后阅读器也会得到结果。它将保持该值直到连接获得closedreader .Dispose() 发生。

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 2013-07-16
      相关资源
      最近更新 更多