在命令关闭后访问OleDBDataReader是否安全



在Java中,一旦语句关闭,你就无法访问ResultSet,尽管很多时候你会得到少量获取的数据,使其看起来像是打开的。但总的来说,这是违反 API 规则的。

但是在 OLEDB 中,我想知道相同的规则是否适用于命令和阅读器。例如,以下代码是否 100% 安全?即使释放了命令,SQL 提取游标也会保持打开状态吗?

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

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

命令被释放时(当执行离开使用块时发生这种情况(,连接不会关闭,因此您可以继续使用 DataReader。

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

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

  • 这可能会在数据库中放置锁,以便您遇到争用问题。

  • 您的阅读器使用的连接保持"忙碌",因此无法重复使用。

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

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

所以,也许你可以这样做,但绝对,你不应该!

相关内容

  • 没有找到相关文章

最新更新