我在公共类里的方法
namespace mySql
{
    class database
    {
       public  SqlDataReader getreader(string sql)
        {
            using (SqlConnection mycon = new SqlConnection(con))
            {
                SqlCommand mycom = new SqlCommand(sql, mycon);
                mycon.Open();
                mycom.CommandType = CommandType.StoredProcedure;
                try
                {
                    SqlDataReader myrea = mycom.ExecuteReader();
                    return myrea;
                }
                catch(SqlException ex)
                {
                    throw new Exception(ex.Message);
                }
                            }
        }
        
    }
    
}
调用的代码
database db = new database();
 SqlDataReader ownread = db.getreader("maxsell");
            while (ownread.Read())
            {
                string a1 = ownread.GetString(0);
                string a2 = ownread.GetDouble(1).ToString();
                string a3 = ownread.GetDouble(2).ToString();                label5.Text = string.Format("销售最热产品是{0},销量{1},总价{2}", a1, a2, a3);
                string maxmonth = " select month(销售时间)from sell where 商品数量=(select MAX(商品数量)from sell)";
                label6.Text = database.getProfit(maxmonth);
            }我的SqlConnection 是不是断线了?我的逻辑哪里错了呢?ado.net

解决方案 »

  1.   

    你使用了using 关键字,因此在离开这个作用域时,连接就断开了。
      

  2.   

     你用SqlConnection的时候只能用using把它释放,所以不用去掉using;
    你SqlDataReader用完了也得用using释放;你给加这么个参数就行;
     SqlDataReader myrea = mycom.ExecuteReader(CommandBehavior.CloseConnection);
    CommandBehavior.CloseConnection这个参数表示,当用户使用完毕DataReader后,当关闭DataReader时,自动关闭与其关联的Connection
      

  3.   

    不去掉using不行,也许我不太明白4楼的意思。不过,我去掉了using,加了 SqlDataReader myrea = mycom.ExecuteReader(CommandBehavior.CloseConnection);谢谢大家的指点。如果到明天晚上还是没有更好的回答,那我后天结贴!
      

  4.   

    datareader是需要连接持续开启的,所以getreader的方法里不能用using connection或者关闭connection。可以通过using调用getreader来在结束时自动关闭连接。其次,lz,
                    catch(SqlException ex)
                     {
                         throw new Exception(ex.Message);
                     }
                     
    这个块代码,隐藏了异常的实际细节,且表面上的结果也和不try catch是一样,又为何要多此一举?
      

  5.   

    如果你可以先扔掉什么“公共类”而归于简单的话,那么可以我在帖子《该如何定义一个集合来保存我从数据库中得到的多行数据》中回复的代码。然后,如果你可以设计程序,可以自己提炼出所谓公共类应该抽象出什么代码来。封装一个高级一点的SQLHelper时返回 DbDataReader 的所谓公共类是被认为有设计思路错误的。