SqlConnection的dispose和close方法差异和using的使用选择

Close() and Dispose() are basically the same thing on an ADO.NET connection

object for providers shipped by Microsoft, and typically for 3rd party

providers as well (haven't seen one that does it differently, but you never

know :). The only difference is that Dispose also clears the connection

string. Calling only 1 of them is enough - whichever you prefer or applies

more to your scenario (e.g. C# "using" statement calls Dispose).

--

Pablo Castro

Program Manager - ADO.NET Team

Microsoft Corp.

引用微软ADO.Team的经理的话说,sqlconnection的close和dispose实际是做的同一件事,唯一的区别 是Dispose方法清空了connectionString,即设置为了null.

SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=northwind;User ID=sa;Password=steveg");
        con.Open();
        con.Close();
        con.Open();
        con.Dispose();
        con.Open();

上例运行发现,close掉的connection可以重新open,dispose的不行,因为connectionstring清空了 ,会抛出InvalidOperationException提示The ConnectionString property has not been initialized ,但请注意此时sqlconnection对象还在。

如果dispose后给connectionString重新赋值,则不会报错。

由此得出的结论是不管是dispose还是close都不会销毁对象,即不会释放内存,它们会把 sqlconnection对象丢到连接池中,那此对象什么时候销毁呢?我觉得应该是connection timeout设置的 时间内,如果程序中没有向连接池发出请求说要connection对象,sqlconnection对象便会销毁,这也是 连接池存在的意义。

刚开始以为dispose会释放资源清空内存,如果这样的话,连接池不是每次都是要创建新对象,那何来 重用connection呢?在网上看到很多人说close比dispose好,我想真正的原因是dispose后的 sqlconnection对象要重新初始化连接字符串而已,并不是象某些人说的dispose会释放对象。

所以在try..catch和using的选择上大胆的使用using吧,真正的效率差异我想可能只有百万分之一秒 吧(连接池重用该连接对象初始化连接字符串的时间),而且enterprise library中封装的data access 层全是用的using,从代码的美观和效率上综合考虑,using好

补充:using不会捕捉其代码快中的异常,只会最后执行dispose方法,相当于finally{dispose}, 本文主要是想说明dispose和close的差异,因为using是绝对dispose的,可是如果人为的写try..finally 有的人会选择close有的人会选择dispose,实际上在这2者的选择上是有差异的,dispose方法会执行 close方法

protected override void Dispose(bool disposing)

{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);

如有错误,希望高手不吝指正

时间: 2024-10-29 12:01:38

SqlConnection的dispose和close方法差异和using的使用选择的相关文章

C#中析构函数、Dispose、Close方法的区别_C#教程

一.Close与Dispose这两种方法的区别 调用完了对象的Close方法后,此对象有可能被重新进行使用:而Dispose方法来说,此对象所占有的资源需要被标记为无用了,也就是此对象要被销毁,不能再被使用.例如常见.Net类库中的SqlConnection这个类,当调用完Close方法后,可以通过Open重新打开一个数据库连接,当彻底不用这个对象了就可以调用Dispose方法来标记此对象无用,等待GC回收. 二.三者的区别如图 析构函数 Dispose方法 Close方法 意义 销毁对象 销毁

js在浏览器兼容教程:函数和方法差异

文章简介:长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javascript兼容性. 1. getYear()方法 [分析说明]先看一下以下代码: var year= new Date().getYear();document.write(year); 在IE中得到的日期是"2010",在Firefox中看到的日期是"110"

.net内存回收与Dispose﹐Close﹐Finalize方法

一. net的对象使用一般分为三种情况﹕ 1.创建对象 2.使用对象 3.释放对象 二.创建对象 1.创建对象实际分为两个步骤﹕变量类型宣告和初始化对象 2.变量类型宣告(declare),如﹕ FileStream fs 这行代码会在当前的变量作用域空间(栈或堆)里建立一个叫做fs的变量﹐至少四个字节吧(因为要存一个对象的地址) 3.初始化对象 对象在使用(调用其方法或属性)前﹐必须进行初始化. 如﹕ fs = new FileStream(@"C:\test.txt",FileMo

C#--内存回收与Dispose﹐Close﹐Finalize方法

问题描述 一.net的对象使用一般分为三种情况﹕1.创建对象2.使用对象3.释放对象二.创建对象1.创建对象实际分为两个步骤﹕变量类型宣告和初始化对象2.变量类型宣告(declare),如﹕FileStreamfs这行代码会在当前的变量作用域空间(栈或堆)里建立一个叫做fs的变量﹐至少四个字节吧(因为要存一个对象的地址)3.初始化对象对象在使用(调用其方法或属性)前﹐必须进行初始化.如﹕fs=newFileStream(@"C:est.txt",FileMode.OpenOrCreat

C# Graphics对象调用Dispose()方法后,为什么绘制的图像还在?

问题描述 C#中Graphics对象调用Dispose()方法后,为什么窗体绘制的图像还在?Dispose()方法不是已经将Graphics对象清除了吗?请大虾根据这个问题,详细解释下原理,谢谢.GraphicsobjGraphics=null;objGraphics=this.CreateGraphics();objGraphics.Clear(SystemColors.Control);objGraphics.DrawRectangle(Pens.Blue,a.Left-1,a.Top-1,

对.Net 垃圾回收的C#编程相关方面(Finalize 和Dispose(bool disposing)和 Dispose())的一些理解体会

编程 Finalize 和Dispose(bool disposing)和 Dispose() 的相同点: 这三者都是为了释放非托管资源服务的. Finalize 和 Dispose() 和Dispose(bool disposing)的不同点: Finalize是CRL提供的一个机制, 它保证如果一个类实现了Finalize方法,那么当该类对象被垃圾回收时,垃圾回收器会调用Finalize方法.而该类的开发者就必须在Finalize方法中处理 非托管资源的释放. 但是什么时候会调用Finali

C#里的资源Dispose

注:这里的文章从"Zendy---勿在浮沙筑高台---"复制,目的是让我有一个比较充分的对这个问题的认识. 文章标题:对.Net 垃圾回收的C#编程相关方面(Finalize 和Dispose(bool disposing)和 Dispose())的一些理解体会 原文章地址:http://www.cnblogs.com/caomao/archive/2006/10/03/152505.html   Finalize 和Dispose(bool disposing)和 Dispose() 的相同点

利用C#实现标准的Dispose模式

标准 本文讲解的是你在建立包含内存以外资源的类型,特别是处置非内存资源的时候,如何编写自己的资源管理代码. 我们已经知道了处置那些占用非受控(unmanaged)资源的对象的重要性,现在应该编写资源管理代码来处置那些包含非内存资源的类型了.整个.NET框架组件都使用一个标准的模式来处理非内存资源.使用你建立的类型的用户也希望你遵循这个标准的模式.标准的处理模式的思想是这样的:当客户端记得的时候使用IDisposable接口释放你的非受控资源,当客户端忘记的时候防护性地使用终结器(finalize

vb.net中类的使用方法

  对于复杂的操作设计解决方案,必须首先确定组成这个系统的对象,在vb中,我们常常把每个对象的属性和操作组合到一个类里面,类的定义如下:                                                Class ClassName                                                            '属性和操作                                               End Cl