3

我正在尝试在我的 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");
        }

登录后,用户被移动到该人登录后可以查看其个人资料的页面。会话正在从登录页面正确获取登录人的值并成功将其传递到下一页。但是在此个人资料页面上发生错误,我认为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();
}

正如业务逻辑中的错误所说,“当 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;
4

3 回答 3

11

您必须调用DataReader.Read以获取结果:

SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
// ...

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

While (dr.Read())
{
  // read data for each record here
}

此外,当这部分代码中没有数据时,您正在尝试访问 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])
于 2011-01-07T18:06:36.387 回答
3

你有问题...

while (dr.HasRows)
{
   /* If this loop is entered, it will run 
    * indefinitely until the datareader miraculously 
    * loses all its rows in a hole somewhere */
}

这将永远不会进入,或者会创建一个无限循环......它要么没有行,要么有行。我认为你的意思是:

while (dr.Read())
{
   /* Do something with the current record */
}

dr.Read()循环到下一条记录并根据是否有要读取的记录返回真或假。初始化数据读取器时,不选择第一条记录。必须通过调用dr.Read()which 来选择它,然后如果找到第一行则返回 true,并且确实会返回 true,直到当前位于最后一行时调用 Read() - 即没有更多行可供读取。

dr.HasRows只是一个属性,它告诉您数据读取器是否包含行……如果确实如此,它将从这里一直保持行直到永恒。例如,如果你想在它有行的情况下做某事,而在它没有行的情况下做其他事情,你会使用它:

if (dr.HasRows)
{
    while (dr.Read())
    {
        /* Display data for current row */
    }
}
else
{
    Console.WriteLine("I didn't find any relevant data.");
}
于 2011-01-07T18:14:45.837 回答
0

尽管没有行,但您正在尝试访问 datareader 中的一行。即,如果 dr 没有进入 while 循环,则 datareader 中没有行,但是您仍在访问您有注释“//这里有什么问题?”的字段。

于 2011-01-07T18:05:37.173 回答