已释放 SqlDataReader 后如何使用其记录

3
我想从SqlDataReader检索所有System.Data.IDataRecord。使用LINQ很简单,但我希望能够处理所有SQL对象并保留数据。以下是我的代码:
private static List<System.Data.IDataRecord> getRecords()
{
    List<System.Data.IDataRecord> records;
    //Make a SqlConnection and SqlCommand.
    using (SqlDataReader reader = command.ExecuteReader())
    {
        records = reader.Cast<System.Data.IDataRecord>().ToList();
    }
    //Dispose of SqlCommand and SqlConnection.
    return records;
}

但这里有个问题:当getRecords()运行完毕后,我获得了我的数据,并请求所有SQL对象被处理掉。但是我是否还在保留着防止正确资源处理的数据?或者一旦垃圾回收器完成它的工作,我的数据最终会变得无效?我认为答案是否定的,但我正在努力寻找确定的答案。我相信Dispose()只会移除非托管的资源,而且由于我将数据放在了List中,所以应该是安全的。谢谢。
1个回答

2

这将很好地运行。

IDataRecord 实例不会受到 SqlDataReader.Dispose 的任何影响。它们包含自己的完整数据和模式信息的副本,与读取器完全分开。


真的吗?几年前我遇到了一个大bug,当时我让IDataRecord在读取器范围之外存在,这导致了问题。那之后我再也没有尝试过。 - Scott Chamberlain
@ScottChamberlain 通过在 ILspy 中查找进行了验证,因为文档中没有明确保证。也许以前不是这样。 - Cory Nelson
就像大多数.NET一样,这些细节并没有记录在案。微软确实有保持未记录功能的历史,因此虽然不是确定的事情,但可能是安全的假设。 - Cory Nelson
@CoryNelson,我不想再让你为此费心了,所以我接受并点赞了你的答案。现在,你能解释一下如何通过ILSpy判断IDataRecord没有受到影响吗? - user1325179
打开ILSpy,查看SqlDataReader.GetEnumerator()。它会复制所有相关的模式数据。 - Cory Nelson
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接