【问题标题】:Use of SqlDataReader Records After Disposal处理后使用 SqlDataReader 记录
【发布时间】:2014-09-30 20:06:04
【问题描述】:

我想从SqlDataReader 中检索所有System.Data.IDataRecords。使用 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() 只会删除非托管资源,并且由于我将数据放在我的列表中,我认为它是安全的。谢谢。

【问题讨论】:

    标签: c# linq dispose sqldatareader


    【解决方案1】:

    这会很好用。

    IDataRecord 实例不受SqlDataReader.Dispose 的任何影响。它们包含自己的数据和架构信息的完整副本,与阅读器完全分离。

    【讨论】:

    • 真的吗?我可以发誓几年前我遇到了一个大错误,我让IDataRecord 存在于读者范围之外,这导致了一个问题。在那之后再也没有尝试过。
    • @ScottChamberlain 通过查看 ILspy 进行了验证,因为它在任何地方的文档中都没有明确保证。也许并非总是如此。
    • @CoryNelson,你所说的证实了我的想法,但你的说法有来源吗?谢谢。
    • @CoryNelson,我看到了您关于在 ILspy 中进行验证的评论。这很好,但你知道微软关于这类事情的任何官方声明吗?
    • 像大多数 .NET 一样,没有记录此类详细信息。微软确实有维护未记录功能的历史,所以虽然这不是一个确定的事情,但可以假设是安全的。
    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多