当dr中没有数据时读取的尝试无效

Cip*_*her 3 c# asp.net datareader no-data

我想在我的ASP.NET网站上创建一个登录表单.目前,存在一些问题.我正在尝试合并功能,以便登录用户具有仅查看其个人资料的优势.登录页面上的代码是这样的:

business.clsprofiles obj = new business.clsprofiles();
        Int32 a = obj.logincheck(TextBox3.Text, TextBox4.Text);
        if (a == -1)
        {
            Label1.Text = "Username/Password incorrect";
        }
        else
        {
            Session["cod"]= a;
            Response.Redirect("profile.aspx");
        }
Run Code Online (Sandbox Code Playgroud)

登录后,用户将被移动到该人员登录后可以查看其个人资料的页面.会话正在从登录页面正确获取登录人员的值,并成功将其传递到下一页.但是在这个配置文件页面上发生错误,我认为grid_bind()下面的方法中存在问题

public void grid_bind()
{
    business.clsprofiles obj = new business.clsprofiles();
    List<business.clsprofilesprp> objprp = new List<business.clsprofilesprp>();
    Int32 z = Convert.ToInt32(Session["cod"]);
    objprp = obj.fnd_profiles(z); //This line of code is passing an integer as required but does not get the desired result from the database
    GridView1.DataSource = objprp;
    GridView1.DataBind();
}
Run Code Online (Sandbox Code Playgroud)

正如业务逻辑中的错误所述,"当dr中没有数据时无效的读取尝试"

public List<clsprofilesprp> fnd_profiles(Int32 id)
        {
            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            SqlCommand cmd = new SqlCommand("fndpro", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
            SqlDataReader dr = cmd.ExecuteReader();
            List<clsprofilesprp> obj = new List<clsprofilesprp>();
            while(dr.HasRows)
            {
                clsprofilesprp k = new clsprofilesprp();

                k.id = Convert.ToInt32(dr[0]);//Something wrong here?

                k.name = dr[1].ToString();
                k.password = dr[2].ToString();
                k.description = dr[3].ToString();
                k.created = Convert.ToDateTime(dr[4]);
                k.modified = Convert.ToDateTime(dr[5]);
                obj.Add(k);
            }
            dr.Close();
            cmd.Dispose();
            con.Close();
            return obj;
        }lesprp k = new clsprofilesprp();

        k.id = Convert.ToInt32(dr[0]);//Something wrong here?

                k.name = dr[1].ToString();
                k.password = dr[2].ToString();
                k.description = dr[3].ToString();
                k.created = Convert.ToDateTime(dr[4]);
                k.modified = Convert.ToDateTime(dr[5]);
                obj.Add(k);
            }
            dr.Close();
            cmd.Dispose();
            con.Close();
            return obj;
Run Code Online (Sandbox Code Playgroud)

Len*_*rri 11

你必须打电话DataReader.Read来获取结果:

SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
// ...
Run Code Online (Sandbox Code Playgroud)

DataReader.Read 返回一个布尔值,所以如果你有多个结果,你可以这样做:

While (dr.Read())
{
  // read data for each record here
}
Run Code Online (Sandbox Code Playgroud)

此外,当这部分代码中没有时,你试图访问dr数据:

k.id = Convert.ToInt32(dr[0]);//Something wrong here?
k.name = dr[1].ToString();
k.password = dr[2].ToString();
k.description = dr[3].ToString();
k.created = Convert.ToDateTime(dr[4]);
k.modified = Convert.ToDateTime(dr[5])
Run Code Online (Sandbox Code Playgroud)