0

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

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

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

1 回答 1

1

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

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

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

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

  • 这可以将锁放在数据库中,这样您就会遇到争用问题。

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

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

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

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

于 2012-04-26T23:04:54.140 回答