Проблема с методом - PullRequest
       5

Проблема с методом

1 голос
/ 22 апреля 2011

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

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;

Так что это говорит о том, что переменная sp не была заполнена данными в блоке try. Это 1015 *

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

public class StudentProfile

{ public StudentProfile (int userID, строка userName, строка userFamilyName, DateTime userBirthDay, строка userTelephone, строка userEmail, DateTime userRegDate, строка userComment, bool userActive) { UserID = userID; UserName = 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;
}

}

Ответы [ 4 ]

0 голосов
/ 24 апреля 2011

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

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();
    }
}

Новый класс:

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 голосов
/ 22 апреля 2011

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

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();

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

0 голосов
/ 22 апреля 2011

Также:

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

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

lblName.Text = ddlStudents.SelectedValue;

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

Кроме того, я считаю, что в вашей базе данных приращения 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)
}

...

Вы также можете подумать о том, чтобы ваши звонки делали ярлыки видимыми внутри условного выражения sp! = Null, чтобы эти ярлыки действительно отображались только при наличии действительного лица. В противном случае держите их перед этим.

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

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

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

0 голосов
/ 22 апреля 2011

Что именно является нулевым?Бьюсь об заклад, GetFullStudentProfile метод возвращает ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...