日期:2014-05-18  浏览次数:20375 次

我想通过类返回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,用到那个返回那个。