2011-04-21 7 views
1

У меня есть еще одна проблема. Мой метод:Проблема с методом

public StudentProfile GetFullStudentProfile(int userID) 
{ 
    SqlConnection conn = new SqlConnection(Config.DbConnectionString); 
    SqlCommand cmd = new SqlCommand("GetFullUserProfile", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 

    cmd.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int)); 
    cmd.Parameters["@UserID"].Value = userID; 
    StudentProfile sp = null; 
    try 
    { 
     conn.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow); 

     if (reader.Read()) 
     { 
      sp = new StudentProfile((int)reader["UserID"], (string)reader["UserName"], (string)reader["UserFamilyName"], (DateTime)reader["UserBirthDay"], (string)reader["UserTelephone"], (string)reader["UserEmail"], (DateTime)reader["UserRegDate"], (string)reader["UserComment"], (bool)reader["UserActive"]); 
     } 

     reader.Close(); 

    } 
    catch (Exception ex) 
    { 
     //lbl.Text = ex.Message; 
    } 
    finally 
    { 
     conn.Close(); 
    } 
    return sp; 
} 

Код в WebUserControl:

protected void ddlStudents_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    CatalogAccess ca=new CatalogAccess(); 
    lblEmail.Visible = true; 
    lblName.Visible = true; 

    lblTelephone.Visible = true; 
    HiddenID.Value = ddlStudents.SelectedValue; 
    lblName.Text = HiddenID.Value; 
    lblEmail.Text = ca.GetFullStudentProfile(ddlStudents.SelectedIndex).UserEmail; 
    lblFamilyName.Visible = true; 
    lblBirth.Visible = true; 
    ddlStudents.Items.Clear(); 
    PopulateStudentsDDL(); 

} 

Когда я запускаю код, я получаю исключение enter image description here

ли я понимаю правильно, что проблема заключается в методе GetFullStudentProfile()? Если это так, как это можно исправить?

Я думаю, что проблема:

StudentProfile sp = null; 

Так он говорит, что переменная зр не была заполнена данными Ьгу блока. Это?

Теперь добавив класс листинг StudentProfile.cs:

public class StudentProfile 

{ общественного StudentProfile (интермедиат идентификатор пользователя, строка имя_пользователя, строка userFamilyName, DateTime userBirthDay, строка userTelephone, строка USEREMAIL, DateTime userRegDate, строка UserComment, BOOL userActive) { UserID = userID; UserName = имя_пользователя; UserFamilyName = userFamilyName; UserBirthDay = userBirthDay; UserTelephone = userTelephone; UserEmail = userEmail; UserRegdate = userRegDate; UserComment = userComment; UserActive = userActive; }

public int UserID 
{ 
    get; 
    set; 
} 

public string UserName 
{ 
    get; 
    set; 
} 

public string UserFamilyName 
{ 
    get; 
    set; 
} 

public DateTime UserBirthDay 
{ 
    get; 
    set; 
} 

public string UserTelephone 
{ 
    get; 
    set; 
} 

public string UserEmail 
{ 
    get; 
    set; 
} 

public DateTime UserRegdate 
{ 
    get; 
    set; 
} 

public string UserComment 
{ 
    get; 
    set; 
} 

public bool UserActive 
{ 
    get; 
    set; 
} 

}

+1

Установите точку останова на этой строке и перейдите в метод getfullstudentprofile. Это даст вам лучшее представление о том, где он сбой – Robert

+0

Я сделал это. Как перейти к getfullstudentprofile? – NCFUSN

+0

Я сделал скриншот IDE, но забыл, что вы не можете помещать скриншоты в комментарии. Если вы не изменили свои ярлыки, это будет F11. Если у вас есть, нажмите «Отладка» -> Шаг в – Robert

ответ

0

Хорошо. Я сделал новый метод:

public UserDetails GetUser(int userID) 
{ 
    SqlConnection conn = new SqlConnection(Config.DbConnectionString); 
    SqlCommand cmd = new SqlCommand("GetFullUserProfile", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int, 4)); 
    cmd.Parameters["@UserID"].Value = userID; 
    try 
    { 
     conn.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow); 
     // Check if the query returned a record. 
     if (!reader.HasRows) return null; 
     // Get the first row. 
     reader.Read(); 
     UserDetails emp = new UserDetails((int)reader["UserID"], (string)reader["UserName"], (string)reader["UserFamilyName"], (DateTime)reader["UserBirthDate"], (string)reader["UserTelephone"], (string)reader["UserEmail"], (DateTime)reader["RegDate"], (string)reader["UserComment"], (int)reader["UserActive"]); 
     reader.Close(); 
     return emp; 
    } 
    catch (SqlException err) 
    { 
     throw new ApplicationException("Data error."); 
    } 
    finally 
    { 
     conn.Close(); 
    } 
} 

New Class:

using System; 

public class UserDetails 
{ 
    public UserDetails(int userID, string userName, string userFamilyName, DateTime userBirthDate, string userTelephone, string userEmail, DateTime regDate, string userComment, int userActive) 
    { 
     UserID = userID; 
     UserName = userName; 
     UserFamilyName = userFamilyName; 
     UserBirthDay = userBirthDate; 
     UserTelephone = userTelephone; 
     UserEmail = userEmail; 
     RegDate = regDate; 
     UserComment = userComment; 
     userActive = UserActive; 
    } 

    public int UserID 
    { get; set; } 

    public string UserName 
    { get; set; } 

    public string UserFamilyName 
    { get; set; } 

    public DateTime UserBirthDay 
    { get; set; } 

    public string UserTelephone 
    { get; set; } 

    public string UserEmail 
    { get; set; } 

    public DateTime RegDate 
    { get; set; } 

    public string UserComment 
    { get; set; } 

    public int UserActive 
    { get; set; } 
} 

После этого в моем заднем коде WebUserControl:

UserDetails ud = ca.GetUser(24); 
    //HiddenID.Value = String.Format(ud.UserID); 
    lblName.Text = ud.UserName; 
    lblEmail.Text = ud.UserEmail; 
    lblFamilyName.Text = ud.UserFamilyName; 
    lblBirth.Text=String.Format("{0:dd/MM/yyy}",ud.UserBirthDay); 
    lblTelephone.Text = ud.UserTelephone; 

И получил метод работал. Итак, этот этап готов. Спасибо всем, кто помог мне. Тема закрыта.

0

Что такое нуль? Делаю ставку GetFullStudentProfile метод возвращает null.

+0

Смотрите скриншот. Если я правильно понял, да! – NCFUSN

+0

Вы уверены, что вам нужно указать выбранный индекс как параметр метода GetFullStudentProfile? Возможно, это должен быть идентификатор студента. В любом случае, перед использованием свойства UserEmail необходимо проверить результат вызова null. –

+0

selected index = userID – NCFUSN

0

Да, это именно то, что произошло. Соответствующий идентификатор студента не найден. Я хотел бы сделать следующее в вашем коде клиента:

StudentProfile sp=ca.GetFullStudentProfile(ddlStudents.SelectedIndex); 
lblEmail.Text = sp != null ? sp.UserEmail : string.Empty; 

Также я бы переписать операцию чтения в GetFullStudentProfile метода, к чему-то вроде этого:

conn.Open(); 
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow); 

if (reader.Read()) 
{ 
    sp = new StudentProfile((int)reader["UserID"], (string)reader["UserName"], (string)reader["UserFamilyName"], (DateTime)reader["UserBirthDay"], (string)reader["UserTelephone"], (string)reader["UserEmail"], (DateTime)reader["UserRegDate"], (string)reader["UserComment"], (bool)reader["UserActive"]); 
} 

reader.Close(); 

Это просто подтяжка для обычного, выглядит лучше имхо

+0

@Dimitri Id. Проблема в том, что sp не заполняется и в результате возвращается null. – NCFUSN

+0

@Dimitri http://img717.imageshack.us/i/unledcwc.png/ – NCFUSN

+0

@Nathan факт, что отладчик показывает значение userID, не означает, что в базе данных, соответствующей этому ID, есть запись. Попробуйте: SELECT * FROM YourUsersTable WHERE ID = 2. Если есть запись, то вы делаете что-то не так в конструкторе для класса StudentProfile. – Dimitri

0

также:

HiddenID.Value = ddlStudents.SelectedValue; 
lblName.Text = HiddenID.Value; 

Я заметил, у наши Autos, что имя было установлено равным 1. Таким образом, я думаю, что вы на самом деле имеют смысл, чтобы установить его как:

lblName.Text = ddlStudents.SelectedValue; 

Я не верю, что установка значения, равного себе пойдет на пользу вам в любом случае. Проверьте свою базу данных, разрешает ли столбцу UserEmail значение nullables?

Кроме того, в вашей базе данных, я считаю, что значение UserID увеличивается с 1, правильно? SelectedIndex, я считаю, начинается с 0. Вам может потребоваться увеличить значение выбранного значения на 1.

Я просто посмотрел на ваш другой вопрос (http://stackoverflow.com/questions/5745820/assign-list-member-to-label), и я чувствую, что у меня есть немного больше информации здесь.

Если база данных не позволяет обнуляемых типов, я хотел бы изменить:

CatalogAccess ca=new CatalogAccess(); 
lblEmail.Visible = true; 
lblName.Visible = true; 

lblTelephone.Visible = true; 
HiddenID.Value = ddlStudents.SelectedValue; 
lblName.Text = HiddenID.Value; 
lblEmail.Text = ca.GetFullStudentProfile(ddlStudents.SelectedIndex).UserEmail; 
lblFamilyName.Visible = true; 
lblBirth.Visible = true; 
ddlStudents.Items.Clear(); 
PopulateStudentsDDL(); 

на:

CatalogAccess ca=new CatalogAccess(); 
lblEmail.Visible = true; 
lblName.Visible = true; 

lblTelephone.Visible = true; 

// if your table's ID increments starting at 0, otherwise ddlStudents.SelectedIndex + 1 
StudentProfile student = GetFullStudentProfile(ddlStudents.SelectedIndex); 

if (student != null) 
{ 
    lblName.Text = student.UserName; 
    lblEmail.Text = student.UserEmail; 
    //rest of the labels going here (I only see Name and Email) 
} 

... 

Вы можете также рассмотреть вопрос о создании ваших вызовов делает видимыми метки внутри зр = null conditional, так что только если отображается действительный человек, он фактически отобразит эти метки. В противном случае сохраните их перед этим.

В противном случае я бы похож на Димитрий и сказать

lblName.Text = student.UserName != null ? student.UserName : String.Empty; 
lblEmail.Text = student.UserEmail != null ? student.UserEmail : String.Empty; 
// etc. 

Если nullables возможно, объект студента может фактически быть назначены, но свойства не могут, которые могут вызвать ваши проблемы во время выполнения приложения.

+0

HiddenID.Value = ddlStudents.SelectedValue; lblName.Text = HiddenID.Value; // здесь я только что проверил, работает ли dropdownlist вообще. – NCFUSN

+0

Доброе утро! Я сделал тест. Явно введите userID: StudentProfile student = ca.GetFullStudentProfile (2); if (student! = Null) { lblName.Text = student.UserName; lblEmail.Text = student.UserEmail; // остальная часть ярлыков, идущих здесь (я вижу только имя и адрес электронной почты) } else { lblName.Text = "It is null"; } и получил ярлык Name: «It's null». Таким образом, проблема в том, что метод не получает UserID – NCFUSN

+0

Я думаю, проблема в методе GetFullStudentProfile(). увы, я не вижу этого. – NCFUSN

Смежные вопросы