在Command关闭后访问OleDBDataReader是否安全

时间:2012-04-26 22:22:08

标签: oledb oledbcommand oledbdatareader

在java中,一旦Statement关闭,你就无法访问ResultSet,尽管很多时候你会获得少量的获取数据,使它看起来是开放的。但总的来说,它违反了API规则。

但在OLEDB中,我想知道同样的规则是否适用于Command和读者。例如,以下代码100%安全吗?即使命令被释放,SQL提取光标是否仍然保持打开状态?

public OleDbDataReader ExecuteReader(string sql, OleDbConnection connection)
{
  using (OleDbCommand command = CreateCommand(sql, connection))
  {
     return command.ExecuteReader();
  }
}

1 个答案:

答案 0 :(得分:1)

根本不建议这样做。你为什么要这样做?

当Command处理时(当执行离开using块时会发生这种情况),连接将不会关闭,因此您可以继续使用DataReader。

然而,这是一个非常糟糕的主意:

  • 您无法确定是否会关闭连接,因为它取决于外部代码。

  • 这可以将锁定放在数据库中,这样就会出现争用问题。

  • 您的阅读器使用的连接保持“忙”状态,以便无法重复使用。

您应该始终确保关闭阅读器和相关连接。使用此设计,您应该依赖返回的DataReader的用户来关闭阅读器和连接。或者至少是读者,如果你使用SqlCommand.ExecuteReader重载接收一个CommandBehavior,你可以在其中设置CloseConnection,以便在读者关闭时自动关闭连接。

但是我坚持认为,你永远不应该让DataReader保持打开太长时间。应尽快迭代并关闭datareader。它可以避免将数据传输到DataTables以及使用它的开销。即绑定到控件(如DataGridView)时,可以将数据直接绑定到控件,避免中间使用DataTable,这需要额外的处理时间和内存(数据到数据表然后控制,而不是直接来自数据源的数据)控制)。

所以,也许你可以这样做,但是肯定的是,你不应该这样做!