本帖最后由 ryantj 于 2009-10-18 03:08:19 编辑

解决方案 »

  1.   

    objReader会自动释放掉。这种理解是对的吗?
    conn.Close();conn.Dispose();是不是也可以省略
    conn.Dispose()一定可以省略。
    好的模式在Dispose的时候会关闭连接,我相信这里SqlConnectio.Close()也可以省略。
      

  2.   

    objReader.Dispose();
    conn.Close();
    conn.Dispose();这三句都可以省略。
      

  3.   

    从来没有采用过这种用法,我看PetShop上面也是这样的,可惜看不懂,问下using怎么用啊
      

  4.   

    using 里面还封装了。try catch 就算是出现异常。也会被释放。
      

  5.   

    connn.Close()不能省略;
    conn.Dispose()可以省略,但愚以为还是不要省略为妙,特别是在循环调用这个方法的时候更是省不得,否则的话你会发现你的sqlmangr.exe进程的内存会不断上涨,甚至超过设置的最大值。
      

  6.   

    jiangqicheng的回答让我又迷糊了
    为什么你说conn.Close()不能省略,conn.Dispose()可以省略??我的理解是:
    sqlconnection的close和dispose实际是做的同一件事,唯一的区别是Dispose方法清空了connectionString,即设置为了null。
    那么能省略conn.Dispose(),当然也就能省略conn.Close()吧?当然,我知道在习惯上我们应该把conn.Close();conn.Dispose();都加上,手工释放一遍。好象如果不手工释放的话,单凭C#提供的垃圾回收。有可能回收不全,产生"野内存"(应该就是你说的sqlmangr.exe进程的内存会不断上涨)。
    但是这里我想讲的是在语义上按我那样理解有错没? 实际中,我当然不会为了省事而省略的!
    (希望各位有经验的高手帮助新人加深理解!)
      

  7.   

    这个其实就是using作为语句使用时,它允许用户定义一个范围,并在此范围末尾自动释放对象。
    语法如下:using (SqlConnection conn = new SqlConnection())
    {  //...}上面的大括号就是用户定义的范围,当执行到using末尾时候,conn对象将自动释放掉!~
      

  8.   

    connn.Close()不能省略; 绝对不能省略。
      

  9.   

    objReader会自动释放掉。这种理解是对的吗? 
    对 conn.Close();conn.Dispose();是不是也可以省略 
    conn.Dispose()一定可以省略。 conn.Dispose();是销毁对象。你把conn定义为全局的话,那么当你conn.Dispose()之后就不能再调用,只能重新new一个,如果是close(),那你可以open()再使用。
    还有如果你conn.Dispose();conn是一个变量名,存在栈里,只是把付给他的内存指针删除掉(指向一个sqlconnection对象),垃圾回收器看到堆叠sqlconnection对象没有指针指向,那么就会将它判定为垃圾,之后就等着回收。而你conn关闭,reader不一定关闭。
    如果你追究下去,那么你就把conn设为全局,之后不要释放,调用CommandBehavior.CloseConnection
    然后再调用一次查询数据库,看看有没异常就知道啦
      

  10.   


    好像不是销毁对象吧,你conn.Dispose();后只要再重新给connnectionString赋值就可以conn.Open()了。这里我又弄糊涂了,reader没关闭,conn会关闭呢?
      

  11.   

    学习
    using 知道一点,又称为作用域吧?
      

  12.   


    Using语句其实就是
    Try
    {
         Class a = new Class();
         //后续操作
    }
    Finally
    {
         a.dispose();
    }1. using是一个语法糖,就是说,编译器在编译的时候会自动给我们加上Try...Finally的形式,并且在finally中执行对象的dispose()方法来释放非托管资源。(楼主可以尝试写个using然后用ILDASM打开看看)
    2. 要使用using的对象必须实现IDispose接口,因为要调用dispose()方法嘛。
    3. Using中不要使用嵌套,也就是using(***){using{***}}这样的写法,就像楼主的代码一样。
    4. close和dispose的区别,如果这个对象在以后还需要使用,那么使用close方法,如果只用这一次,那么使用dispose方法。
    5. Using和try/catch是无关的,他不会帮助你catch住异常。嗯,我记得的就这些了,想起来再补充。
      

  13.   

    呵呵  hide1984 说的和我理解的一样哈!
      

  14.   

    我想问一下,using结束后,这个using块中定义的所有变量都会被释放吧?因为里面的是局部变量