小弟我建了个类,目的是通过不同的sql语句取得不同的DataReader    public class ODBECT
    {
        private string Oledbconnstring = ConfigurationSettings.AppSettings["OledbConnectionString"].ToString();
        private OleDbConnection conn;
        private OleDbCommand comm;
        private OleDbDataReader dr;
        public ODBECT(string comtxt, string path)
        {
            Oledbconnstring += path;
            conn = new OleDbConnection(Oledbconnstring);
            comm = new OleDbCommand(comtxt, conn);
            conn.Open();
        }
        public string rein(string comtxt)
        {
            //comm.Dispose();
            //comm.Cancel();
            comm = null;
            comm = new OleDbCommand(comtxt, conn);
            comm.CommandText = comtxt;
                try
                {
                    comm.ExecuteNonQuery();
                    return "ok";
                }
                catch (Exception e)
                {
                    return e.Message;
                }
                finally
                {
                    conn.Close();
                }
            
        }
        public OleDbDataReader datareader()
        {
            //dr = null;
            dr = comm.ExecuteReader(CommandBehavior.CloseConnection);
            return dr;
        }
        public void closdr()
        {
            dr.Close();
        }
        public string tesst()
        {
            return comm.CommandText;
        }
    }碰到的问题是:无法去两次DataReader 
要么是 ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭要么是 已有打开的与此连接相关联的 DataReader,必须首先将它关闭
请大虾帮忙看看其中的问题

解决方案 »

  1.   

    datareader关闭后就不可用了,重新声明一个吧。
      

  2.   

    dr = comm.ExecuteReader(CommandBehavior.CloseConnection);这里每次都(在ExecuteReader方法内部)实例化一个新的Reader出来
    而此时,旧的reader还没有关
    此时的conn是不能继续执行任何Command的设计的不太好
    不推荐返回Reader,因为他是基于连接的
      

  3.   

    那将数据直接返回出来该有什么方法好呢?
    前台调用了  closdr() 再使用 rein(sql)  rein里comm也重新定义了新的command了阿, 可再用datareader()就报无连接,可是我输出tesst()
    的时候,又是有值得阿
    二楼所说的,datareader关闭后就不可用了 ,我也试过不调用关闭closdr(),直接调用rein(sql) ,我想rein里comm也重新定义了新的command,可报错就是已经有关联的 DataReader,不推荐返回Reader的话,用什么方法能达到直接返回数据呢?
      

  4.   

    怎么用?
    public string rein(string comtxt)
    {
       using(OleDb dr=comm.ExecuteDataReader())
      {
      }
    }
    这样?可是报错comm.ExecuteDataReader()
    指教下
      

  5.   

    多谢3楼的提示,改为dataset类型了
      

  6.   

    难道一个datareader只能用一次?