2011-04-21 80 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; 

所以說,SP變量沒有填充在try塊數據。是嗎?

現在加入StudentProfile.cs類上市:

public class StudentProfile 

{ 公共StudentProfile(INT用戶ID,用戶名字符串,字符串userFamilyName,日期userBirthDay,串userTelephone,串USEREMAIL,日期userRegDate,串UserComment在,布爾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 2011-04-21 23:01:44

+0

我做到了。如何步驟獲得滿意的個人資料? – NCFUSN 2011-04-21 23:29:19

+0

我截取了IDE的截圖,但忘記了不能在截圖中添加評論。如果你還沒有修改你的快捷鍵,它會是F11。如果有,請點擊Debug - > Step Into – Robert 2011-04-22 00:11:13

回答

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

新類:

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 2011-04-21 23:01:54

+0

您確定需要將選定的索引指定爲GetFullStudentProfile方法的參數嗎?也許它應該是一些學生ID。無論如何,在使用UserEmail屬性之前,您需要檢查調用的結果爲null。 – 2011-04-22 01:49:25

+0

selected index = userID – NCFUSN 2011-04-22 05:52:48

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 2011-04-22 15:27:32

+0

@Dimitri http://img717.imageshack.us/i/unledcwc.png/ – NCFUSN 2011-04-22 15:32:49

+0

@Nathan調試器顯示userID值的事實並不意味着在數據庫中有匹配該ID的記錄。試試這個:SELECT * FROM YourUsersTable WHERE ID = 2。如果有記錄,那麼你在StudentProfile類的構造函數中做了錯誤的事情。 – Dimitri 2011-04-22 20:00:20

0

另外:

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

我y中發現這個名字設爲1時我們的汽車所以我覺得你其實是意味着將其設置爲:

lblName.Text = ddlStudents.SelectedValue; 

我不認爲設置等於本身的價值是要你以任何方式受益。檢查你的數據庫,UserEmail的列是否允許可空?

此外,在您的數據庫中,我相信UserID從1開始遞增,正確嗎? SelectedIndex,我相信,從0開始。您可能需要將selectedvalue項目遞增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的內側看到標籤=無條件,以便只有當有效的人員顯示時纔會顯示這些標籤。否則,把它們放在它之前。

否則我會做類似迪米特里說

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 2011-04-22 05:43:35

+0

早上好!我做了一個測試。顯式放置userID:StudentProfile student = ca.GetFullStudentProfile(2);如果(學生!=空) { lblName.Text = student.UserName; lblEmail.Text = student.UserEmail; //其餘的標籤在這裏(我只看到名稱和電子郵件) } else { lblName.Text =「It's null」; }並得到名稱標籤說:「它是空的」。所以問題是,該方法沒有得到UserID – NCFUSN 2011-04-22 06:39:38

+0

我認爲問題出在GetFullStudentProfile()方法。唉,我看不到它。 – NCFUSN 2011-04-22 06:51:41