2013-04-04 106 views
-2

我很困惑,爲什麼我試圖返回一個數據集時收到空引用異常。C# - 爲什麼我得到一個空引用異常?

我有一個處理程序和DBaccess類在nTier體系結構。

首先這裏是我的casefile處理程序/和訪問類的一部分工作正常。 我包括他們,因爲我不知道爲什麼這個工程,其他不工作。

public class CaseFileHandler 
{ 
    CaseFileAccess caseaccess = null; 

    public CaseFileHandler() 
    { 
     caseaccess = new CaseFileAccess(); 
    } 



    public DataSet getCaseFileDataset(int caseID) 
    { 
     return caseaccess.GetCaseFileDataSet(caseID); 
    } 


    public bool UpdateCasefile(CaseFile casefile) 
    { 
     return caseaccess.updateCasefile(casefile); 
    }  
} 

這裏是訪問類。返回數據集的方法工作得很好。

public class CaseFileAccess 
{ 
    const string CONNECTION_STRING = "Data Source = SQLSERVER;Initial Catalog=CaseManager;Integrated Security=SSPI;"; 

    DBManager _DAL = new DBManager(DataProvider.SqlServer, CONNECTION_STRING); 


    public CaseFile GetCaseFile(int caseID) 
    { 
     CaseFile casefile = new CaseFile(); 

     _DAL.Open(); 
     _DAL.CreateParameters(1); 
     //stuff 
     return casefile; 
    } 

    public DataSet GetCaseFileDataSet(int caseID) 
    { 
     _DAL.Open(); 
     _DAL.CreateParameters(1); 
     _DAL.AddParameters(0, "@CaseID", caseID); 
     DataSet ds = _DAL.ExecuteDataSet(CommandType.StoredProcedure, "sp_BL_AdjustmentsPage_READ_Case"); 
     _DAL.Close(); 
     return ds; 
    } 

    public bool updateCasefile(CaseFile casefile) 
    { 
     int result = 0; 
     _DAL.CreateParameters(56); 

    //stuff 
     _DAL.Open(); 
     result = _DAL.ExecuteNonQuery(CommandType.StoredProcedure, "dbo.sp_BL_AdjustmentsPage_UPDATE_Case"); 
     _DAL.Close(); 
     return (result > 0); 
    } 

} 

這就是爲什麼我很困惑。 我創建了一個處理程序和訪問類返回的數據集綁定到ASP:下拉列表和結構相同的方式類作爲案卷類

這裏是處理類:

public class ddMenuHandler 
{ 
    ddMenuAccess menuaccess = null; 

    public ddMenuHandler() 
    { 
     ddMenuAccess menuaccess = new ddMenuAccess(); 
    } 

    public DataSet dsCwkrCaseEditing(int cwID) 
    { 
     return menuaccess.CwkrsCaseEditing(cwID); 
    } 

} 

而且訪問類:

public class ddMenuAccess 
{ 
     const string CONNECTION_STRING = "Data Source = SQLSERVER;Initial Catalog=CaseManager;Integrated Security=SSPI;"; 

     DBManager _DAL = new DBManager(DataProvider.SqlServer, CONNECTION_STRING); 

     public DataSet CwkrsCaseEditing(int cwID) 
     { 
      _DAL.CreateParameters(1); 
      _DAL.AddParameters(0, "@ID",cwID); 
      _DAL.Open(); 
      DataSet ds = _DAL.ExecuteDataSet(CommandType.StoredProcedure, "sp_BL_CwkrsActiveCaseEdit"); 
      _DAL.Close(); 
      return ds; 
     } 

    } 

這是我的代碼背後:

protected global::Adjustfiles.CaseFile casefile; 
    protected global::System.Web.UI.WebControls.DropDownList ddCaseworker; 

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack == false) 
     { 
      int caseID = Convert.ToInt32(Request.QueryString["caseID"]); 
      MySession.Current.editCaseID = caseID; 

      CaseFileHandler cfhandler = new CaseFileHandler(); 
      casefile = cfhandler.getCaseFile(caseID); 

      DataSet DScase = cfhandler.getCaseFileDataset(caseID); 
      fv_casefile.DataSource = DScase; 
      fv_casefile.DataBind(); 
      BindDdCwkrs(); 

     } 
    } 


    private void BindDdCwkrs() 
    { 
     ddMenuHandler menuaccess = new ddMenuHandler(); 
     DataSet ds = menuaccess.dsCwkrCaseEditing(casefile.CaseWorkerID); 
     int i = 0; 
     ddCaseworker.DataSource = ds; 
     ddCaseworker.DataTextField = "CwName"; 
     ddCaseworker.DataValueField = "CwID"; 
     ddCaseworker.DataBind(); 
     ddCaseworker.SelectedValue = Convert.ToString(casefile.CaseWorkerID); 

    } 

在線ddCaseworker.DataSource = ds;是我得到我的空引用異常,menuaccess是null。但爲什麼?

Source Error: 

Line 29:public DataSet dsCwkrCaseEditing(int cwID) 
Line 30:{ 
Line 31:  return menuaccess.CwkrsCaseEditing(cwID); 
Line 32:} 
Line 33: 


System.NullReferenceException was unhandled by user code 
Message=Object reference not set to an instance of an object. 
Source=Adjustfiles 
StackTrace: 
at Adjustfiles.ddMenuHandler.dsCwkrCaseEditing(Int32 cwID) in H:\Visual Studio 2010\Projects\Adjustfiles\Adjustfiles\ddMenuHandler.cs:line 31 
     at Adjustfiles.adjustFile66EditCase.BindDdCwkrs() in H:\Visual Studio 2010\Projects\Adjustfiles\Adjustfiles\adjustFile66EditCase.aspx.cs:line 45 
     at Adjustfiles.adjustFile66EditCase.Page_Load(Object sender, EventArgs e) in H:\Visual Studio 2010\Projects\Adjustfiles\Adjustfiles\adjustFile66EditCase.aspx.cs:line 29 
     at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) 
     at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) 
     at System.Web.UI.Control.OnLoad(EventArgs e) 
     at System.Web.UI.Control.LoadRecursive() 
     at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    InnerException: 
+0

'ddCaseworker'必須爲空。這是初始化在哪裏? – ChrisF 2013-04-04 11:39:52

+1

請參閱http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net幫助'NullReferenceException' – pascalhein 2013-04-04 11:40:40

+0

ddCaseworker是一個asp下拉列表,我很困惑你的意思。我將編輯我的代碼背後的ddcaseworker是對象 – Sonny123 2013-04-04 11:45:05

回答

6

你instatiating ddMenuAccess作爲本地函數變量而不是類變量:

行:

ddMenuAccess menuaccess = new ddMenuAccess(); 

更改爲:

this.menuaccess = new ddMenuAccess(); 

將正常運行預期。 ( 「這一點。」 可選的,但有助於澄清)

public class ddMenuHandler 
{ 
    ddMenuAccess menuaccess = null; 

    public ddMenuHandler() 
    { 
     this.menuaccess = new ddMenuAccess(); 
    } 

    public DataSet dsCwkrCaseEditing(int cwID) 
    { 
     return menuaccess.CwkrsCaseEditing(cwID); 
    } 

}

+0

+1:是的,就是這樣。接得好! – 2013-04-04 11:44:37

+0

+1,在'31'行拋出異常,這是'menuaccess.CwkrsCaseEditing'語句。奇怪爲什麼有人低估了這個 – 2013-04-04 11:47:51

+0

+1也是爲了讓它正確(並閱讀所有代碼) – dash 2013-04-04 11:48:43

相關問題