在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,这需要额外的处理时间和内存(数据到数据表,然后到控件,而不是直接从数据源到控件的数据(。
所以,也许你可以这样做,但绝对,你不应该!