我怀疑是不是我用了Static变量所致,因为static限制其为静态变量,这样是不是很不合理?

解决方案 »

  1.   

    没错,对于一个connection只能存在一个datareader。
      

  2.   

    do not use static Connection object, let ADO.NET take care of the pooling
      

  3.   

    To alj(alj)
      DataReader读取数据需要一个持续的连接
    你只要保证一个DataReader操作完,并关闭了连接后
    再使用同一个连接就不会有问题了
      

  4.   

    对于你的问题:
    1、一个连接只能使用一个DataReader,因为DataReader不是一次把数据读到本地,而是已类似游标的方式从数据库一次读取一条数据,并且,在Reader读数据的时候,连接不能关闭。
    2、你的这种方式值的商榷,对于Connection这种资源,你写成static无可厚非,但是你必须得保证使用完毕就关闭连接,免得造成资源的浪费。这里是我答的一个关于连接的问题,你可以看看:
    http://expert.csdn.net/Expert/topic/1517/1517079.xml?temp=.3955042
      

  5.   

    你不想要使用静态的Connection
    直接使用完,连接后close就可以了
    这时连接并不是真的取消了,而是返回到连接池中了
    关于连接池参见
    ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.htm
      

  6.   

    你的类可以按照下面的建议修改一下:1、对于数据层处理的组件,最好可以封装处理,只留出获取数据的方法。
    2、另一个值得考虑的问题是采用何种方式传递数据,DataReader是最快但最不好的方法;因为你不能够保证调用者能够释放Reader占用的资源,并且逻辑层和数据层不能做到松散耦合,用DataSet是.Net推荐的方式,但是这种方式太浪费内存,因为DataSet比较庞大,可能它的功能你只需要用到10%;自己来写数据结构是折衷的方案,但是需要编码量比较大,而且需要设计合理的数据结构,来保证效率。
    3、对于你写的类,建议目前可以把静态的声明都去掉,然后实现IDisposable接口,在Dispose方法里面释放连接,这样可以一定程度上增强你的设计;使用的时候,每次都构造一个新的DB对象来处理。
      

  7.   

    对于一个connection只能存在一个datareader.
    打开connection之前先把connection关掉。
    datareader是需要人工控制connection的开关的。
    DataSet 可以用连接池,比较方便。connection自动控制
    public static bool OpenConn()
    {
    //如果conn尚未联接,就使用strConn联接数据库
    if(conn==null) conn=new SqlConnection(strConn); //如果conn之前已经打开,则直接返回True;
    if(conn.State==ConnectionState.Open) 
                               {
                                 conn.Close();
                               }
    try
    {
    conn.Open();
    return true;
    }
    catch(SqlException e)
    {
    throw(e);
    }
    }
      

  8.   

    如果使用DataSet对象,那么还是否会存在这样的问题呢?
      

  9.   

    如果是用DataSet的话,它的数据是由DataAdapter 填充进来的,通过查看DbDataAdapter(所有数据库DataAdapter的父类)的Fill方法的源码,可以得知,它也是使用DataReader来读取数据,但是它是一次把所有的数据都读进DataSet的Table中,然后关闭和释放连接,这样数据就由DataSet内部的数据结构来保存了。所以使用DataSet的话,不用考虑这个问题,.Net 都帮你做了。
      

  10.   

    如果数据简单就用数组保存第一次的DataReader好了,特方便。
      

  11.   

    当 DataReader 打开时,该 DataReader 将以独占方式使用 Connection。在初始 DataReader 关闭之前,将无法对 Connection 执行任何命令(包括创建另一个 DataReader)。
      

  12.   

    你可以CommandText中写多条sql语句

    SqlCommand cm=new SqlCommand("select * from table1 select * from table2")
    SqlDataReader dr=cm.ExecuteReader();
    while(dr.read())
    {                //返回 select * from table1 的结果集
    ....
    }
    dr.NextResult()
    while(de.read())
    {                 //返回 select * from table2 的结果集
    ...
    }