【问题标题】:Why DataAdapter is not Disposable为什么 DataAdapter 不是一次性的
【发布时间】:2012-11-17 17:42:19
【问题描述】:

我知道可能有一个明显的原因,但我找不到它..

我通常在DB连接和数据读取过程中使用using语句,但是我不能在DataAdapter上使用它,因为它没有实现IDisposable

另外:填充数据集后它会如何表现?

它会自行关闭连接吗?

只关闭它还是丢弃它?

数据集填充后是否必须自己处理内部连接?如果是这样,为什么IDataAdapter 没有相关的属性/方法?

【问题讨论】:

  • IDataAdapter..其他适配器应该从它派生

标签: c# .net database-connection dataadapter


【解决方案1】:

DataAdapter 不会关闭连接,因为您可能希望继续使用此连接来填充其他 DataSets

例外情况是在调用Fill 方法之前连接未处于打开状态(Thanx Richard):https://stackoverflow.com/a/2472886/2258

【讨论】:

  • ..那么为什么它不是一次性的?
  • 谨慎回答。 Fill 可以关闭连接;在这里查看答案:stackoverflow.com/a/2472886/2258
  • @RichardMorgan - 好评论!
【解决方案2】:

DataAdapter 没有实现 IDisposable,因为它没有任何需要在正常垃圾回收之外处理的成员变量。换句话说,它不需要实现 IDisposable。

如果您有兴趣,可以在这里查看 Mono DataAdapter 的源代码:http://www.java2v.com/Open-Source/CSharp/2.6.4-mono-.net-core/System.Data/System/Data/Common/DataAdapter.cs.htm

一般来说,如果您要在使用后关闭连接,请继续将连接放入 using 范围,但也可以使用单例并在使用相同连接的多个范围中拥有多个 DataAdapter。

希望这是有道理的。

【讨论】:

  • 数据适配器一次性的,请参阅文档 msdn.microsoft.com/en-us/library/...。单声道 DataAdapter 可能不是……但这不是单声道问题。
  • 它在 4.0 及更高版本中是一次性的。
  • 答案中的链接已失效 - “找不到 www.java2v.com 的服务器 IP 地址。”
【解决方案3】:

DataAdapter 实例不包含对非托管代码的引用。它只是充当命令和数据集之间的“桥梁”。

DataAdapter 充当 DataSet 和数据源之间的桥梁 用于检索和保存数据。 DataAdapter 提供了这个桥梁 通过映射 Fill,它会更改 DataSet 中的数据以匹配 数据源中的数据,以及更新,它会更改数据源中的数据 数据源来匹配DataSet中的数据。

来源:http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.aspx

【讨论】:

  • mmm..但是Fill方法不需要连接,所以我想适配器有它的参考。这样 GC 就不会释放连接,因为 dataAdapter 还活着,对吧?
  • 适配器本身没有对连接的引用。附加到适配器的命令具有对连接的引用。请参阅此处的示例:msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多