在java中,一旦Statement关闭,你就无法访问ResultSet,尽管很多时候你会获得少量的获取数据,使它看起来是开放的。但总的来说,它违反了API规则。
但在OLEDB中,我想知道同样的规则是否适用于Command和读者。例如,以下代码100%安全吗?即使命令被释放,SQL提取光标是否仍然保持打开状态?
public OleDbDataReader ExecuteReader(string sql, OleDbConnection connection)
{
using (OleDbCommand command = CreateCommand(sql, connection))
{
return command.ExecuteReader();
}
}
答案 0 :(得分:1)
根本不建议这样做。你为什么要这样做?
当Command处理时(当执行离开using块时会发生这种情况),连接将不会关闭,因此您可以继续使用DataReader。
然而,这是一个非常糟糕的主意:
您无法确定是否会关闭连接,因为它取决于外部代码。
这可以将锁定放在数据库中,这样就会出现争用问题。
您的阅读器使用的连接保持“忙”状态,以便无法重复使用。
您应该始终确保关闭阅读器和相关连接。使用此设计,您应该依赖返回的DataReader的用户来关闭阅读器和连接。或者至少是读者,如果你使用SqlCommand.ExecuteReader重载接收一个CommandBehavior,你可以在其中设置CloseConnection,以便在读者关闭时自动关闭连接。
但是我坚持认为,你永远不应该让DataReader保持打开太长时间。应尽快迭代并关闭datareader。它可以避免将数据传输到DataTables以及使用它的开销。即绑定到控件(如DataGridView)时,可以将数据直接绑定到控件,避免中间使用DataTable,这需要额外的处理时间和内存(数据到数据表然后控制,而不是直接来自数据源的数据)控制)。
所以,也许你可以这样做,但是肯定的是,你不应该这样做!