老话题:DbConnection Close还是Dispose?(高手请进)

skyandcode 2015-11-11 02:22:42
加精
在操作数据库后,调用Close和Dispose有什么区别?

说明:
1. 网上有许多人说Dispose后,就不能再Open。
Dispose后,只要重新为ConnnectionString赋值,依然可以Open。

2. 在Pooling为false时(禁止使用连接池),Close和Dispose都会关闭连接;而在Pooling为true(允许使用连接池)时,有人说Close不会关闭连接,会将连接扔回连接池;而Dispose会关闭连接。
前部分说得对;但通过测试,Pooling为true时,即使调用Dispose,连接依然只是放回连接池,不会关闭。通过sql profiler可以观察到这个过程。

msdn说两者在功能上是等效的。大神们发表看法。。。
...全文
7544 79 打赏 收藏 转发到动态 举报
写回复
用AI写文章
79 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamXiaMi 2015-12-07
  • 打赏
  • 举报
回复
引用 78 楼 skyandcode 的回复:
不是没有看过源代码,你贴出的是最简单的部分。 或许你可以看帖子的内容,或者看其他人的讨论先。 [quote=引用 76 楼 iamXiaMi 的回复:] [quote=引用 74 楼 skyandcode 的回复:] [quote=引用 73 楼 zoelva 的回复:] 微软都开源了.net了,源码都在msdn和github上了,为什么还有人会问这种问题?不清楚,自己去看源码不就得了,看看Dispose和Colse是怎么处理的不就明明白白了!!!!!!!,程序员的悲哀!!
大神,请去看了来回答。[/quote] protected virtual void Dispose(bool disposing) { if (disposing) { Close(); } } 为什么不呢?现在可以结贴了么? https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data/Common/DbConnection.cs[/quote][/quote] 楼主无非要确定Dispose和Close的差别么,现在不是已经能证明无差别了。 至于Close的实现,可以查看,SqlConnection里查看Close代码~ 而且看起来,无论pool是否是ture,最终都会回到pool中。
skyandcode 2015-12-07
  • 打赏
  • 举报
回复
不是没有看过源代码,你贴出的是最简单的部分。 或许你可以看帖子的内容,或者看其他人的讨论先。
引用 76 楼 iamXiaMi 的回复:
[quote=引用 74 楼 skyandcode 的回复:] [quote=引用 73 楼 zoelva 的回复:] 微软都开源了.net了,源码都在msdn和github上了,为什么还有人会问这种问题?不清楚,自己去看源码不就得了,看看Dispose和Colse是怎么处理的不就明明白白了!!!!!!!,程序员的悲哀!!
大神,请去看了来回答。[/quote] protected virtual void Dispose(bool disposing) { if (disposing) { Close(); } } 为什么不呢?现在可以结贴了么? https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data/Common/DbConnection.cs[/quote]
iamXiaMi 2015-12-07
  • 打赏
  • 举报
回复
引用 10 楼 wmxcn2000 的回复:

-- 都是这样写,没有  Close ,也没有 Dispose ,不过也没出什么问题,谁指点一下?
 using (SqlConnection myConn = new SqlConnection(ConnectionString))
 {
     using (SqlCommand cmd = new SqlCommand(sqlString, myConn))
     {
         myConn.Open();
         rows = cmd.ExecuteNonQuery();
     }
     // TO DO .
 }
因为实现了Dispose啊~
iamXiaMi 2015-12-07
  • 打赏
  • 举报
回复
引用 74 楼 skyandcode 的回复:
[quote=引用 73 楼 zoelva 的回复:] 微软都开源了.net了,源码都在msdn和github上了,为什么还有人会问这种问题?不清楚,自己去看源码不就得了,看看Dispose和Colse是怎么处理的不就明明白白了!!!!!!!,程序员的悲哀!!
大神,请去看了来回答。[/quote] protected virtual void Dispose(bool disposing) { if (disposing) { Close(); } } 为什么不呢?现在可以结贴了么? https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data/Common/DbConnection.cs
iamXiaMi 2015-12-07
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
正常.net的规则是Dispose,Close只是调用了Dispose,之所以存在Close,就是很多从别的语言转来的往往只用Close
你说反了吧?Dispose调用的是Close,Dispose可能做的更多。
skyandcode 2015-12-04
  • 打赏
  • 举报
回复
引用 73 楼 zoelva 的回复:
微软都开源了.net了,源码都在msdn和github上了,为什么还有人会问这种问题?不清楚,自己去看源码不就得了,看看Dispose和Colse是怎么处理的不就明明白白了!!!!!!!,程序员的悲哀!!
大神,请去看了来回答。
zoelva 2015-12-04
  • 打赏
  • 举报
回复
微软都开源了.net了,源码都在msdn和github上了,为什么还有人会问这种问题?不清楚,自己去看源码不就得了,看看Dispose和Colse是怎么处理的不就明明白白了!!!!!!!,程序员的悲哀!!
飞天凤凰601 2015-12-03
  • 打赏
  • 举报
回复
我都是Close后,再Dispose 不过一般都在一个过程里执行,完后,在其他过程里再OPEN,
skyandcode 2015-11-29
  • 打赏
  • 举报
回复
引用 69 楼 sollion 的回复:
可以参考:http://www.cnblogs.com/Mr_JinRui/archive/2011/04/12/2013530.html close掉的connection可以重新open,dispose的不行,因为connectionstring清空了,会抛出InvalidOperationException提示The ConnectionString property has not been initialized,但此时sqlconnection对象还在。 如果dispose后给connectionString重新赋值,则不会报错。
这篇我看过了,里面有些说法有理,有些上下文自身矛盾。估计博主是拷贝的,整个排版很乱,不分子标题和段落,看起来真让人恼火。
sollion 2015-11-28
  • 打赏
  • 举报
回复
可以参考:http://www.cnblogs.com/Mr_JinRui/archive/2011/04/12/2013530.html close掉的connection可以重新open,dispose的不行,因为connectionstring清空了,会抛出InvalidOperationException提示The ConnectionString property has not been initialized,但此时sqlconnection对象还在。 如果dispose后给connectionString重新赋值,则不会报错。
冰冷的小爪 2015-11-26
  • 打赏
  • 举报
回复
erictang2003 2015-11-26
  • 打赏
  • 举报
回复
close是必须的。dispose即使没有显示调用,GC还是会做回收的。
qq_33089155 2015-11-24
  • 打赏
  • 举报
回复
Microstrip Filters for RF Microwave Applications
minhua1983 2015-11-18
  • 打赏
  • 举报
回复
引用 16 楼 skyandcode 的回复:
[quote=引用 10 楼 wmxcn2000 的回复:]

-- 都是这样写,没有  Close ,也没有 Dispose ,不过也没出什么问题,谁指点一下?
 using (SqlConnection myConn = new SqlConnection(ConnectionString))
 {
     using (SqlCommand cmd = new SqlCommand(sqlString, myConn))
     {
         myConn.Open();
         rows = cmd.ExecuteNonQuery();
     }
     // TO DO .
 }
using 是针对Dispose模式设计的,本质上是try-finally。 在using内定义的变量实际上是IDispose类型,在finally中会调用它的Dispose方法。[/quote] 我所知道的也是这样。
  • 打赏
  • 举报
回复
暂时还没用到,先看看
ss_shary 2015-11-17
  • 打赏
  • 举报
回复
在连接池中是重写了close方法,只是将资源放回到连接池中,没有彻底释放资源
luityuy 2015-11-14
  • 打赏
  • 举报
回复
路过~~~~~~·
angel6709 2015-11-13
  • 打赏
  • 举报
回复
亲自测试,Orcle.Access.Dll 使用close会存在未释放的内存。
  • 打赏
  • 举报
回复
学习来了,涨知识
  • 打赏
  • 举报
回复
留个名。。。。
加载更多回复(50)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧