2011-04-21 7 views
1

다른 문제가 있습니다. 내 방법 WebUserControl에서문제가있는 경우

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

코드 :

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; 

을 그래서 변수 특검팀은 try 블록에서 데이터로 채워되지 않았 음을 말한다 :

나는 문제라고 생각합니다. 그렇지?

public class StudentProfile 

{ 공공 StudentProfile (INT 사용자 ID, 문자열 이름, 문자열 userFamilyName, 날짜 시간 userBirthDay, 문자열 userTelephone, 문자열 USEREMAIL, 날짜 시간 userRegDate, 문자열 USERCOMMENT, 부울 :

이제 StudentProfile.cs 클래스 목록을 추가 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; 
} 

}

+1

해당 줄에 중단 점을 설정하고 getfullstudentprofile 메소드를 실행하십시오. 그게 어디서 실패했는지 더 잘 알 수있을거야 – Robert

+0

내가 해냈어. getfullstudentprofile을 찾으려면 어떻게해야합니까? – NCFUSN

+0

IDE의 스크린 샷을 찍었지만 주석에 스크린 샷을 넣을 수는 없다는 것을 잊지 마십시오. 바로 가기를 수정하지 않으면 F11이 표시됩니다. 있다면 디버그 -> Step into into – 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(); 
    } 
} 

새로운 클래스 : WebUserControl의 내 백 코드에서 그 후

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

: 나는 새로운 방법을 만들어

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

정확히 null이 무엇입니까? GetFullStudentProfile 메서드는 null을 반환합니다.

+0

을 클릭하십시오. 스크린 샷을 참조하십시오. 내가 이해한다면, 맞아! – NCFUSN

+0

선택한 인덱스를 GetFullStudentProfile 메소드의 매개 변수로 지정해야합니까? 어쩌면 그것은 어떤 학생 신분이어야합니다. 어쨌든 UserEmail 속성을 사용하기 전에 null에 대한 호출 결과를 확인해야합니다. –

+0

selected index = userID – NCFUSN

0

네, 정확히 그랬습니다. 전달 된 ID와 일치하는 학생을 찾을 수 없습니다.

또한
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; 

내가 Y에 발견 나는 그 자체와 동일한 값을 설정하는 것은 어떤 식 으로든 당신을 혜택을 가고 있다고 생각하지 않습니다

lblName.Text = ddlStudents.SelectedValue; 

: 이름이 1로 설정되어 우리의 자동차는 그래서 당신이 실제로로 설정하는 의미를 생각합니다. 데이터베이스를 확인하십시오. UserEmail의 열에서 null을 허용합니까?

또한 데이터베이스에서 UserID가 1에서 시작하여 증가한다고 생각하십니까? SelectedIndex는 0부터 시작한다고 생각합니다. 선택한 값 항목을 1 씩 늘려야 할 수도 있습니다.

방금 ​​다른 질문 (http://stackoverflow.com/questions/5745820/assign-list-member-to-label)을 보았습니다. 여기에 조금 더 자세한 정보가 있습니다. 데이터베이스가 nullable 형식을 허용하지 않는 경우

, 내가 바꿀 것 :

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

에 : 당신은 또한 SP 내부에 보이는 레이블을 만드는 통화를 가하고 고려할 수

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

... 

= 유효하지 않은 사람이 표시 될 때만 실제로 해당 레이블을 표시합니다. 그렇지 않으면 앞에 보관하십시오.

그렇지 않으면 나는 디미트리 유사 할 및 nullables이 가능한 경우

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

가, 학생 객체가 실제로 할당 할 수있는 말을하지만, 속성은 런타임에 응용 프로그램 문제가 발생할 수 있으며 문제를 해결하지 않을 수있는 것입니다.

+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 's null"; } 이름 라벨에 "Null"이라고 표시되어 있습니다. 그래서 문제는 그 방법은 UserID – NCFUSN

+0

을 얻지 못한다는 것입니다. 저는이 문제가 GetFullStudentProfile() 메소드에 있다고 생각합니다. 아아, 나는 그것을 볼 수 없다. 이 줄의 – NCFUSN

관련 문제