2010-11-26 3 views
0

У меня есть функция, как этотNull ссылка исключение

public bool CheckMentorAccess() 
{ 
    bool blnAllow = false; 
    try 
    { 
     string strSelectMentorQuery = "SELECT COUNT(DISTINCT MLL.LED_ID) FROM M_USER_DETAILS MUD INNER JOIN M_LEADERLED MLL " + "ON MLL.LED_ID = MUD.PK_ID WHERE MLL.LEADER_ID = '" + Session["UserID"].ToString() + "' AND MUD.ACTIVE = 1 AND MLL.START_DATE <= Getdate() AND" + " MLL.END_DATE > Getdate()"; 

     int intNoOfMembers = Convert.ToInt32(cSQLHelper.myExecuteScalar(strSelectMentorQuery)); 

     if (intNoOfMembers > 0) 
     { 
      blnAllow = true; 
     } 
    } 
    catch (Exception ex) 
    { 
     ExceptionLogger.LogException(ex); 
     blnAllow = false; 
    } 

    // Return the value 
    return blnAllow; 
} 

И тогда я использую, если как этот

if ((Int32.Parse(Session["ROLE_ID"].ToString()) == 3) && (CheckMentorAccess() == true)) 
{ 
    cmbempList.Visible = true; 
} 

но бросает пустую ссылку исключение на первой линии образца выше

Может ли кто-нибудь мне помочь ..

+0

ли на самом деле существует ключ «ROLE_ID» в сессии? – bblack 2010-11-26 07:26:19

ответ

0

Ну, если трассировка стека только точки на этой линии, я думаю, это проблема:

Int32.Parse(Session["ROLE_ID"].ToString()) 

Это будет бросить NullReferenceException если таковые Session["ROLE_ID"] возвращает нуль.

(Он будет бросать FormatException, если значение существует в сессии, но не является допустимым числом.)

Вполне возможно, что это призыв к CheckMentor(), который не удается, конечно - но тогда ваш стек след должен сказать так. Это может привести к сбою, если, например, cSQLHelper.

1

Вы можете попробовать

if (Session["ROLE_ID"] != null && (Int32.Parse(Session["ROLE_ID"].ToString()) == 3) && (CheckMentorAccess() == true)) 
{ 
    cmbempList.Visible = true; 
} 

Сначала проверьте, что Session["ROLE_ID"] существует, прежде чем использовать ToString.

Всегда безопаснее использовать Convert.ToString.

0

Попробуйте это - проверить значения, которые вы используете при вызове метода:

if (Session["ROLE_ID"] != null) 
{ 
    if ((Int32.Parse(Session["ROLE_ID"]) == 3) && (CheckMentorAccess())) 
    { 
     cmbempList.Visible = true; 
    } 
} 

и проверить в методе

public bool CheckMentorAccess() 
{ 
    if (Session["UserID"] == null) 
    { 
     throw new NullReferenceException("UserID is null"); 
    } 

    bool blnAllow = false; 
    try 
    { 
     string strSelectMentorQuery = "SELECT COUNT(DISTINCT MLL.LED_ID) FROM M_USER_DETAILS MUD INNER JOIN M_LEADERLED MLL " + "ON MLL.LED_ID = MUD.PK_ID WHERE MLL.LEADER_ID = '" + Session["UserID"].ToString() + "' AND MUD.ACTIVE = 1 AND MLL.START_DATE <= Getdate() AND" + " MLL.END_DATE > Getdate()"; 

     int intNoOfMembers = Convert.ToInt32(cSQLHelper.myExecuteScalar(strSelectMentorQuery)); 

     blnAllow = intNoOfMembers > 0; 
    } 
    catch (Exception ex) 
    { 
     ExceptionLogger.LogException(ex); 
     blnAllow = false; 
    } 

    // Return the value 
    return blnAllow; 
} 
Смежные вопросы