我的DAL层是这样的:
1.在DBHress.cs里写公用的方法;
里面有有DataReader
代码如下:
 protected static string conString = ConfigurationManager.ConnectionStrings["web"].ConnectionString.ToString().Trim();  
      /* 
      * GetReader 方法
      * 执行SQL简单的语句,返回 DataReader
      * 
      */
        public static SqlDataReader GetReader(string sql)
        {
            SqlConnection connection = new SqlConnection(conString);
            SqlCommand cmd = new SqlCommand(sql, connection);            try
            {
                connection.Open();
                SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return reader;            }
            catch (System.Data.SqlClient.SqlException e)
            {
                throw new Exception(e.Message);
            }
            
        }
2. 我在city_Service.cs这里调用了上面的 GetReader 方法
    public static City getCity(int cID)
    {
        string sql = "select * from City where cID=" + cID;
        SqlDataReader r = DBHress.GetReader(sql);
        if (r.Read())
        {
            City city = new City();
            city.CID = Convert.ToInt32(r["cID"]);
            city.CName = (string)r["cName"];
            r.Close();           
            return city;
        }
        else
        {             
            r.Close();           
            return null;
        }    }问题:
在服务器事件中找到警告!
Exception type: InvalidOperationException Exception message: ExecuteReader 要求已打开且可用的连接。连接的当前状态为正在连接。
------------------------------------------
我不都已经是关了吗? 还是没关完? 还是关错地方? 
       

解决方案 »

  1.   

       if (r.Read()) 
            { 
                City city = new City(); 
                city.CID = Convert.ToInt32(r["cID"]); 
                city.CName = (string)r["cName"]; 
                r.Close();    //这样不行啊,人家还在read(),就关闭了,这样只能找一条啊      
                return city; 
            } 
      

  2.   

    用using,不手动调用DataReader.Close()。
      

  3.   

    http://topic.csdn.net/u/20090419/23/5e5030f4-7201-430a-a786-3dd7d4f1699a.html
      

  4.   

    其实你调用的方法可以这样写:   
     public static City getCity(int cID) 
        { 
            string sql = "select * from City where cID=" + cID; 
            SqlDataReader r = DBHress.GetReader(sql); 
            City city = null;
            if (r.Read()) 
            { 
                city = new City(); 
                city.CID = Convert.ToInt32(r["cID"]); 
                city.CName = (string)r["cName"]; 
            }          
            r.Close();          
            return city; 
        } 
    这样写是不是即节省了代码又不会出错啦……
      

  5.   

    SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
    楼主既然用上这个地方
    干嘛还要通过r.Close();   这只是关闭阅读器
    你的连接还没有关
    注意这个含义:SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
    当关闭sqlconnection 对象 时 他的阅读器 也相应关闭
    不知道我说的清楚不