SqlConnection conn = getConnection.getConn();
 using (conn)
 {
      SqlCommand cmd = new SqlCommand();
      cmd.Connection = conn;
      cmd.CommandText = "Insert Into XX values(xxxxx)";
      cmd.Parameters.AddWithValue("@xxxx", xxx);
      cmd.Parameters.AddWithValue("@xxxxx", xxxx);
      conn.Open();
      cmd.ExecuteNonQuery();
 }
这是一贯写法。后来偶尔看到有人在cmd.ExecuteNonQuery();后面写了conn.close();
请问有必要吗?
我一直都没close过,也没见出过异常啊。
请高手解答。

解决方案 »

  1.   

    没有必要 使用了using 在using 包含的内容执行完 会自动释放资源
      

  2.   

    这就是用USING的好处
    其实不必手动关闭
    结束USING的时候会自动关闭的
      

  3.   

    欢迎大家来到这个交流大家庭,
    本群技术交流,疑难解答。大家 一起努力... 
    .NET开发群号: 38850938
      

  4.   

    我接一个项目改版,以前是其他人做的,在数据库连接这一个是尝的不错苦头.上面的写法在做正规的项目时是不会用到了,因为一般把Sqlcommand的连接集成在dll里面了, 但规范的写法是在写conn.close() 有这个必要,为后期维护考虑.
    跟大家共享一个问题.
    用Dreader dr,dr2读取数据
    While(dr.reader())

    dr2=Sqlcommand....
    }
    这样数据库的连接,能否及时关闭
      

  5.   

    我一般这样写using (SqlConnection conn = ×××××){
    ……
    }
    这样更省事相信微软的垃圾回收自己手写我认为纯属多余,有专家认为还会引起内存从构,效率变低
    (这是WROX红皮书上讲的,可不是我的评论啊)楼主放心吧
    我亲自做过测试,回收很及时的.
    自己写的话估计反而不好
      

  6.   

    不用,using会被编译成
    try
    {}finaly
    {Dispose();}
    语句MSDN:
    可以实例化资源对象,然后将变量传递给 using 语句,但这不是最佳做法。在这种情况下,该对象将在控制权离开 using 块之后保持在范围内,即使它可能将不再具有对其非托管资源的访问权也是如此。换句话说,再也不能完全初始化该对象。如果试图在 using 块外部使用该对象,则可能导致引发异常。由于这个原因,通常最好是在 using 语句中实例化该对象并将其范围限制在 using 块中。Font font2 = new Font("Arial", 10.0f);
    using (font2) // not recommended
    {
        // use font2
    }
    // font2 is still in scope
    // but the method call throws an exception
    float f = font2.GetHeight();  
      

  7.   

    就是说 using (SqlConnection conn = getConnection.getConn())
     {
          SqlCommand cmd = new SqlCommand();
          cmd.Connection = conn;
          cmd.CommandText = "Insert Into XX values(xxxxx)";
          cmd.Parameters.AddWithValue("@xxxx", xxx);
          cmd.Parameters.AddWithValue("@xxxxx", xxxx);
          conn.Open();
          cmd.ExecuteNonQuery();
     }
    最好这样
    否则在别的地方引用conn可能会有异常,而如上写conn范围只作用于using 块