2011-01-07 3 views
3

Я пытаюсь создать форму входа на моем веб-сайте ASP.NET. В настоящее время есть некоторые проблемы. Я пытаюсь включить такие функции, что вошедший в систему пользователь имеет представление, чтобы просмотреть только его профиль. Код на странице входа в систему заключается в следующем:.Неверная попытка прочитать, когда нет данных в dr

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; 
+0

возможно дубликат [Invalid попытке чтения при отсутствии данных присутствует] (http://stackoverflow.com/questions/1147615/invalid-attempt-to-read-when-no-data-is-present) –

ответ

11

Вы должны вызвать DataReader.Read, чтобы получить результат:

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

DataReader.Read возвращает логическое значение, поэтому если у вас есть более чем 1 результат, вы можете сделать:

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

Кроме того, вы» re пытается получить доступ к данным 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]) 
0

Вы пытаетесь получить доступ к строке в DataReader хотя нет ни одной строки. i.e , если dr не входит в цикл while, тогда нет строк в datareader, однако вы по-прежнему обращаетесь к полям, где у вас есть комментарий «// Что-то не так здесь?».

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

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

if (dr.HasRows) 
{ 
    while (dr.Read()) 
    { 
     /* Display data for current row */ 
    } 
} 
else 
{ 
    Console.WriteLine("I didn't find any relevant data."); 
} 
Смежные вопросы