Неверная попытка чтения, когда в др нет данных - PullRequest
3 голосов
/ 07 января 2011

Я пытаюсь создать форму входа на моем сайте 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();
}

есть проблема. Как говорит ошибка в бизнес-логике, "недопустимая попытка чтения, когда нетданные присутствуют в др "

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;

Ответы [ 3 ]

11 голосов
/ 07 января 2011

Вы должны позвонить 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])
3 голосов
/ 07 января 2011

У вас проблема с ...

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(), который затем вернет true, если найдена первая строка, и действительно вернет true, пока Read () не будет вызван, когда в данный момент находится в последней строке - т.е. больше не осталось строк для чтения. 1011 *

dr.HasRows - это просто свойство, которое сообщает вам, содержит ли заголовок данных строки ... которые, если это произойдет, сохранят строки отсюда до вечности. Например, вы должны использовать это, если хотите что-то сделать, если у него есть строки, а что-то еще, если его нет:

if (dr.HasRows)
{
    while (dr.Read())
    {
        /* Display data for current row */
    }
}
else
{
    Console.WriteLine("I didn't find any relevant data.");
}
0 голосов
/ 07 января 2011

Вы пытаетесь получить доступ к строке в хранилище данных, хотя строк нет.то есть, если д-р не входит в цикл while, в устройстве чтения данных нет строк, однако вы все еще получаете доступ к полям, где у вас есть комментарий "// Что-то здесь не так?".

...