第一问:
SqlConnection cn = new SqlConnection("……")使用了cn.Dispose后还需要cn.Close()吗?=========================================勤劳的分割线========================================第二问:
SqlDataReader sdr = SqlHelper.ExecuteReader(cn, CommandType.StoredProcedure, "……", 参数);
需要手动Close并Dispose吗?===================================懒惰的分割线====================================第三问:
using (SqlDataReader sdr = SqlHelper.ExecuteReader(cn, CommandType.StoredProcedure, "……", 参数))
{
  …………
}如果使用了using关键字,DataReader还需要Close和Dispose吗?=====要死不活的分割线=====请大家解答解答,新项目几万人用,对性能要求特别高,一定要处理好这些细节。
如果方便的话,请按一定格式一个问一个问回答。万分感谢。

解决方案 »

  1.   

    以上都只要Close就行了,GC会自动回收的。
      

  2.   

    垃圾回收机制会回收
    不放心就Dispose
      

  3.   

    1 no
    2 yes
    3 no
      

  4.   

    Close: 是关闭连接线
    Dispose: 是释放生成的连接对象SqlConnection它们两个都能关闭连接
      

  5.   

    using关键字,表示当执行完: {  }后,立即释放{}里面的变量 ,释放内存.
      

  6.   

    谢谢大家。再问一个问题,如果没有try然后finally{ 关闭cn或者关闭sdr }异常了,出错的话连接会自动关闭还是就一直连在那里呢?
      

  7.   

    1、Dispose调用了Close:
    protected override void Dispose(bool disposing)
    {
          if (disposing)
          {
                switch (this._objectState)
                {
                      case ConnectionState.Open:
                      {
                            this.Close();
                            break;
                      }
                }
                this._constr = null;
          }
          base.Dispose(disposing);
    }
     
    2、SqlDataReader占用的资源在SqlConnection关闭后会强制释放的,但是手动释放SqlDataReader也是必要的。3、离开using块会自动调用Dispose,勿需再显示调用,同样的,SqlDataReader.Dispose也会调用Close方法。
      

  8.   

    谢谢大家。再问一个问题,如果没有try然后finally{ 关闭cn或者关闭sdr }异常了,出错的话连接会自动关闭还是就一直连在那里呢?Close方法一般不会抛出异常,如果抛出异常,那将是致命的,无法确定连接是否已经关闭。如果在Close方法中抛出了异常,应视作无法修复的错误,终止程序的执行并通知用户。
      

  9.   

    Close: 是关闭连接线
    Dispose: 是释放生成的连接对象SqlConnection
      

  10.   

    我的意思是如果程序出错了,连接还会存在在那里吗?
    比如db.insert("@Test", "Test"); // 这条语句出错,没有@Test这个参数的.
    cn.Close(); // 这里还能执行吗?不执行是不是连接就一直开在那里在?
      

  11.   

    每当 SQL Server .NET Framework 数据提供程序遇到服务器生成的错误时,都将创建此类。(客户端错误作为标准的公共语言运行库异常引发。)SqlException 始终包含至少一个 SqlError 实例。严重程度等于或小于 10 的消息是信息性消息,它们指示由用户输入信息中的错误所导致的问题。严重程度 11 至 16 的消息是由用户生成的,可以由用户更正。严重程度 17 至 25 的消息指示软件或硬件错误。当发生严重程度为 17、18 或 19 的错误时,虽然可能无法执行特定语句,但仍可以继续工作。当严重程度等于或小于 19 时,SqlConnection 保持打开状态。当严重度等于或大于 20 时,服务器通常会关闭 SqlConnection。但是,用户可以重新打开连接并继续操作。在这两种情况下,执行命令的方法都会生成 SqlException。有关 SQL Server 所发送的警告和信息性消息的信息,请参见“SQL Server 联机图书”中的“疑难解答”一节。SqlException 类映射到 SQL Server 严重度。
      

  12.   

    可以用SqlConnection.State来知道是不是还连接着。