DataSet的主要目的不就是为了实现在非持续连接下的操作.
微软为什么在ado.net中加入Dataset呢?

解决方案 »

  1.   

    每次都打开,然后执行操作,用完之后就关闭。
    ----------------------------
    Try
    ---------------------
    SqlConnection.Open()
    ----------
    mySqlCommand.ExecuteReader()
     .......
     ......
    ----------
    或者
      mySqlCommand.ExecuteNonQuery()
    ------------
    catch
      ..........
    finally    SqlConnection.Close()
    end try
    -----------------------------------------
    -------------------------------
      

  2.   

    ADO采用非连接的方法访问数据库,你每次执行一次select语句据把数据库的当前状态存于dataSet中,此后你就算一直保持连接也没有意义,还会抛出异常.所以我建议执行完操作就断开连接
      

  3.   


    ADO.net有两种方法读数据:DataAdapter 和 DataReader(以SqlClient为例)
       1、DataApapter 可用于填充数据集(DataSet),适用于读取多个表里的大量数据.用此对象时,SqlConnection可以显示的打开、关闭,也可以隐示的打开和关闭。用法如下://创建SqlConnection对象
    string strConn = "server=;dataBase=;uid=;pwd=;";
    SqlConnection conn = new SqlConnection(strConn);
    //创建SqlDataAdapter对象
    string strSQL = "SQL statement";
    SqlDataAdapter adapter = new SqlDataAdapter(strSQL,conn);
    //创建并填充DataSet
    DataSet ds = new DataSet();
    adapter.Fill(ds);//在这里objConn自动Open,然后自动Close填充多张表时:
    conn.Open(); //在这里显示打开SqlConnection对象
    adapter.SelectCommand = New SqlCommand(strSql1, conn); 
    adapter.SelectCommand.Parameters.Add("@TheYear", 1997);
    adapter.SelectCommand.Parameters.Add("@TheQuantity", 30) ;
    adapter.Fill(ds, "Orders"); 
    adapter.SelectCommand = New SqlCommand(strSql2, conn) ;
    adapter.Fill(ds, "Customers") ;
    adapter.SelectCommand = New SqlCommand(strSql3, conn) ;
    adapter.Fill(ds, "Employees") ;
    conn.Close() ;//在这里显示关闭SqlConnection对象
       2、DataReader相当于ADO里的RecordSet,适用于读取小量的数据,用此对象时必须显示的打开和关闭SqlConnection对象。加上错误处理后的用法如下:SqlCommand comm = new SqlCommand(strSql,conn);
    SqlDataReader reader;
    conn.Open();//注意SqlConnection对象必须在try块的外面Open,否则会报错!!
    try
    {
       reader = comm.ExecuteReader();
       while(reader.Read())
       {
          //
       }
    }
    catch(SqlException se)
    {
       //
    }
    finally
    {
       conn.Close();
    }DataAdapter的第二个例子也可以同样的加上错误处理,用法一样。
    以上是我个人的理解,由不对的地方请高手指正!!
      

  4.   

    DataSet我还没怎么用过,但是对于DataReader的话你是一定要在结束时close的,否则连编译都通不过。这也是ado.net的一个特点,就是每次操作都要连接,操作完了关闭,而不象以前可以一直保持连接。
      

  5.   

    如果是在一个类或者是一个页面中(也包括页面之间的操作频率很快时),建议不要打开后就关闭。。ADO.Net中使用连接池,在一定的时间内打开的连接如果没有强制关闭他是不会自动关闭的,下次再用时,他就会直接从连接池中取,节约资源。
      

  6.   

    如果是在一个类或者是一个页面中(也包括页面之间的操作频率很快时),建议不要打开后就关闭。。ADO.Net中使用连接池,在一定的时间内打开的连接如果没有强制关闭他是不会自动关闭的,下次再用时,他就会直接从连接池中取,节约资源。
      

  7.   

    也可以使用
    using(SqlConnection)
    {
      //do something
    }
    相当于一个try...catch...finally块
      

  8.   

    同意triout和redcaff_l的说法,除非特殊应用需要,connection应该被及时关闭以释放资源。对于pursuer所关心的节省系统资源的问题,在ADO.NET中可以通过连接池来很好的解决。尤其在使用SqlClient的情况下,程序员完全可以随用随Open,然后用完就Close。Connection被Close以后会自动的存放在Connection Pool里面,只要在lift time范围之内再Open,就会从连接池里直接取用,相当于一个缓存的机制,能够大大减少对SQL Server的连接数。即使是从连接池的角度来看,connection也应该被随时关闭,这样connection pool中的连接才能最大限度的得到利用。关于连接池,有兴趣的网友可以参考这片帖子:http://www.csdn.net/expert/topic/874/874135.xml
    Hogwarts - S(u)ddenly dis@ppeared...

    本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。  
    为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。  
      

  9.   

    那在什么时候创建SqlConnection对象比较好呢
    //创建SqlConnection对象
    string strConn = "server=;dataBase=;uid=;pwd=;";
    SqlConnection conn = new SqlConnection(strConn);
    是在每一个操作时创建一次
    还是初始化时就创建好,然后让他上直保持这个状态!
    两者有何不同
      

  10.   

    其实,connection的生命期多长也是需要具体情况具体分析的。如果过于频繁的new和close,会增加调用构造函数的开销,降低了程序的性能;但另一方面,如果connection一直不close不释放,虽然省去了构造函数的开销,但对于资源的占用太厉害,降低了SQL Server的性能。所以从提高综合性能考虑,最终总是根据具体情况进行调整,取一个折衷的做法的。
    Hogwarts - S(u)ddenly dis@ppeared...

    本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
      

  11.   

    同意楼上的说法,一般情况下(WinForm编程)建议处理完一个操作逻辑单元后关闭连接,不过对于特殊情况还需特殊对待;而对于WEB编程,则应该在需要时打开连接,不需要时立即关闭。
      

  12.   

    同意上面的说法,因为对于WEB编程,由于并发的人数,使用的人很多,如果立即关闭的话,可能会造成响应比较慢,并且也不利于网络传输,想想看,每次访问都先CONNECT OPEN,然后CONNECT CLOSE,在CONNECT,累不累啊!
      

  13.   

    .net中的数据库连接式被自动pool的,就是说,如果你使用一个连接字符串去连接一个数据库,当使用完成后,调用close时,这个连接并不是真的被关闭了,而是被放在一个数据库连接池中,而下次再次使用同一个连接字符串时,这个连接会被自动从池中取出,而不是重新生成一个新的,因此,调用close后再new一个新的并不会耗费时间。关键问题是两次使用的必须以同一个连接字符串,微软的文档也是这样推荐的。还有,如果在对象一级声明一个数据库连接,应该在使用时打开改连接,而使用完成后立即关闭,这样会可以及时地将连接放回到缓冲池中,供其他线程使用,不然只有到对象被释放时,连接才会被自动被关闭。尤其是在web开发中,如果将连接存入了Session而没有关闭,这样当这个Session有效时,数据库连接会被一直占用
    当有大量的访问时,会建立大量的数据库连接,给造成服务器的负担,系统会变得不稳定。另一方面,如果对象的构造函数中使用了系统资源,如打开了文件或数据库连接,该应该使用Dispose模式,在dispose方法中释放资源,使用对象是要把对象申明在using中(这个using是一个语句,与使用命名空间不同,可以参考.net的帮助),超出using范围是系统会自动调用对象的dispose方法,要不然就自己手动管理。这样可以比较安全的使用数据库连接。可以参考visual studio .net中的duwamish的例子。
      

  14.   

    当然是,每次进行一次操作时把它open,操作结束时再close.
    因为ASP.NET是用了连接池的,开关的消耗并不大的
      

  15.   


     我也一直在想这个问题,的确和很多人的看法一样,我也觉得每次OPEN,每次CLOSE 。但是,我现在有如下情况:  我在WEB工程中 写了一个数据访问类  Class DataAcess
      {
    //传入sGetFieldSQL返回一个DataTable
        Public DataTable GetTable(string sGetFieldSQL)
        {
          ……
        }//传入sGetFieldSQL返回一个DataSet
        Public DataSet GetTable(string sGetFieldSQL)
        {
          ……
        }   //传入sSQL,更新数据表
        public bool  UpdateData(string sSQL)
        {
          ……
         }
       //还有很多类似的方法,包括存储过程和以上方法的重载
       }    然后我的WEB Solution中所有对数据库的访问操作都直接通过调用以上相关的方法来完成,现在有一个问题, 我的SQLConnection在那里来New,在那里来OPEN,什么时候CLOSE
     有如下方法:
      1. 我用一个Application变量来处理:在Global.asax中Application_Star中生成并OPEN SQLConnection,而在Application_End中来close。把以上的生成并打开的SQLConnection存放在Application中,而以上的方法中需要SQLConnection时候从Application中取得;  
     2.和方法1类似,也可以在 Global.asax的Global类中,定义一个SQLConnection类,new、OPEN、CLOSE操作和上同, 只是访问的时候不是从APPLICATION中取得SQLConnection,而是做为Global类中的一个Public属性(属性类型就是SQLConnection类拉)调用.我想只只是以上方法的“变种”,效率上应该是一样的!
     3.我在以上DataAcess类的每个方法中,每次调用的时候都New并且OPEN一个SQLConnection,而通过Try……Catch……Finnally来保证方法调用完成后Close此SQLConnection;
     4.我在DataAcess的构造函数中New 并且Open SQLConnection ,而在其析构函数中Close……
     5.每个WEB页面需要调用DataAcess的时候,都New 并OPEN一个SQLConnection,而后访问DataAcess的时候传入 SQLConnection……
        请大家帮我分析,以上几种方法中,那种最为合理和效率来得快! 
    注意,我的是WEB SOLUTION,或者还有什么更好的方法,请大家指点……