2010-11-26 105 views
0

我有这样空引用异常

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"]返回null。

(如果在会话存在的价值,但不是有效的整数它会抛出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; 
}