当前位置: 代码迷 >> ASP.NET >> 小弟我想通过类返回SqlDataReader类型对象,如何才页面中调用这个对象呢
  详细解决方案

小弟我想通过类返回SqlDataReader类型对象,如何才页面中调用这个对象呢

热度:3115   发布时间:2013-02-25 00:00:00.0
我想通过类返回SqlDataReader类型对象,怎么才页面中调用这个对象呢?
类中的方法
C# code
public SqlDataReader Dr(Dictionary<string,string> parms,string ctext)    {        SqlConnection con = this.Dbcon();        SqlCommand cmd = new SqlCommand(ctext,con);        foreach (KeyValuePair<string, string> kv in parms)        {            cmd.Parameters.AddWithValue(kv.Key,kv.Value);        }        con.Open();        SqlDataReader dr = cmd.ExecuteReader();        con.Close();        return dr;    }

页面中的调用
C# code
            Cldb cldb=new Cldb();            Dictionary<string, string> parmsRead = new Dictionary<string, string>();            parmsRead.Add("@UserName", strUsername);            SqlDataReader da = cldb.Dr(parmsRead, sql2);                        while (da.Read())            {                UserID = da.GetGuid(0);            }

这样写会报错Invalid attempt to call Read when reader is closed.想问一下高手怎么修改呢?我主要是想把数据库调用放到类中,但是类中不出现类似
UserID = da.GetGuid(0);这样的特殊代码,以便于日后在其他程序里继续调用,所以UserID = da.GetGuid(0);这样的代码只能写在页面中.

------解决方案--------------------------------------------------------
一般返回dataset或者datatable就好了,因为它们是离线的数据集

而reader你要控制连接的关闭,类里先关了用不了,调用的时候再关又不好。
------解决方案--------------------------------------------------------
C# code
public SqlDataReader Dr(Dictionary<string,string> parms,string ctext){    SqlConnection con = this.Dbcon();    SqlCommand cmd = new SqlCommand(ctext,con);    foreach (KeyValuePair<string, string> kv in parms)    {        cmd.Parameters.AddWithValue(kv.Key,kv.Value);    }    con.Open();    SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);//当关闭DataReader时自动关闭Connection    // con.Close();不能关闭    return dr;}
------解决方案--------------------------------------------------------
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
这样就可以了, 返回dataset,datable,dr,用到那个返回那个。