Avatar billede hald. Nybegynder
12. oktober 2004 - 12:33 Der er 9 kommentarer

Object reference not set to an instance of an object? hvorfor?

Jeg sidder og bikser med lidt C#-crap der virkelig driller mig.

Min applikation er opdelt i 3 lag:
---------------------
et præsentationslag
et forretningslag
et data access lag
---------------------

Jeg har så det problem, at jeg får en fejl når jeg opretter ét DataSet i mit præsentationslag og sender det videre ned til mit forretningslag, der igen sender DataSet'et videre ned til mit data access lag. I data access laget udfører jeg min query og indsætte resultattabellen i mit dataset (tabellen kunne f.eks. være "SELECT * FROM administrator").

Jeg ved at det godt kan lyde lidt sort, så i få lige en oversigt over de metoder det vedrører i de forskellige lag:
--------------------------------------------------------------




----- GUI --------

protected System.Web.UI.WebControls.DataGrid Master;
protected System.Web.UI.WebControls.DataGrid Details;
protected System.Web.UI.WebControls.Label Label1;
       
public DataSet oDataSet = new DataSet();


private void Page_Load(object sender, System.EventArgs e)
{
  this.getListOfAdministrators();
}




private void getListOfAdministrators()
{
  //   
  BLAdmintype oBLAdmintype = new BLAdmintype();
  oBLAdmintype.getListOfAdmintypes(out oDataSet);

  DataView dvMaster = oDataSet.Tables["admintype"].DefaultView;
  Master.DataSource = dvMaster;
  Master.DataBind();

}

----- END OF GUI --------




----- Admintype Business lag: --------

public class BLAdmintype : BLBasis
{
  //    variabler:
  public DataRelation oDataRelation;

  // konstruktør
  public BLAdmintype(){}


  public void getListOfAdmintypes(out DataSet oDataSet)
  {
    DataSet testDS = new DataSet();
    try
    {
       
        // kalder Admintype-klassens Data Access lag:       
          DAAdmintype oDAAdmintype    = new DAAdmintype();
        oDataSet = oDAAdmintype.getListOfAdmintypes();


        // kalder Administrator-klassens Business lag, der så selv
        // foretager et kald til Administrator-klassens Data Access lag:       
        BLAdministrator oBLAdministrator = new BLAdministrator();
        oBLAdministrator.getListOfAdministrators(out oDataSet);

                //relationer oprettes -> DataRelation(<parent>, <child>):
        oDataRelation = new DataRelation("admintype_administrator",   
                        oDataSet.Tables["admintype"].Columns["id"],
                        oDataSet.Tables["administrator"].Columns["admintype_id"]);
       
        // oprretter relation imellem Administrator- og Admintype-tabellerne
        oDataSet.Relations.Add(oDataRelation);
    }
    catch(Exception oException)
    {
        throw oException;
    }
  }//end of getListOfAdmintypes

}//class

----- End of Admintype-klassens Business lag  --------




----- Admintype Data Access lag: --------

public class DAAdmintype : DABasis
{   
       
  public DAAdmintype() {}


  public DataSet getListOfAdmintypes()
  {
    MySqlConnection oConn = GetConnection();
    string sql;
    MySqlDataAdapter oAdapter;
    DataSet oDataSet = new DataSet();

    try
    {
        //    vi eksekverer vores query, hvorfter vi smider resultatet ind
        //    i en "tabel" i vores dataset, der i sidste ende returneres af funktionen:   
        sql        = "SELECT * FROM admintype";
        oAdapter    = new MySqlDataAdapter(sql, oConn);
        oAdapter.Fill(oDataSet, "admintype");

        oConn.Open();

        return oDataSet;
    }
    catch(Exception oException)
    {
        throw oException;
    }
    finally
    {
        oConn.Close();
    }

  }//end of getListOfAdmintypes()

}//class


----- End of Admintype-klassens Data Access lag  --------




...fejlen får jeg er:

Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:


Line 37:     catch(Exception oException)
Line 38:     {
Line 39:         throw oException;
Line 40:     }
Line 41: }//


Source File: c:\inetpub\wwwroot\server\bladmintype.cs    Line: 39

Stack Trace:


[NullReferenceException: Object reference not set to an instance of an object.]
  server.BLAdmintype.getListOfAdmintypes(DataSet& oDataSet) in c:\inetpub\wwwroot\server\bladmintype.cs:39
  server.administratorlist.getListOfAdministrators() in c:\inetpub\wwwroot\server\administratorlist.aspx.cs:46
  server.administratorlist.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\server\administratorlist.aspx.cs:33
  System.Web.UI.Control.OnLoad(EventArgs e) +67
  System.Web.UI.Control.LoadRecursive() +35
  System.Web.UI.Page.ProcessRequestMain() +731




...håber virkelig at i kan hjælpe :-(
Avatar billede hald. Nybegynder
12. oktober 2004 - 12:47 #1
Det jeg specifikt er i tvivl om er, om jeg anvender min "out"-paramtere de rigtige steder og som de reelt skal anvendes...
Avatar billede arne_v Ekspert
12. oktober 2004 - 12:50 #2
Jeg ville erstatte den out parameter og lade metoden returnere det data set.

Langt nemmere.

Men jeg vil ikke garantere at det er der fejlen ligger.
Avatar billede hald. Nybegynder
12. oktober 2004 - 12:58 #3
Det er det ikke - har allerede prøvet. Grunden til at jeg vil anvende out-parameter, skyldes at DataSet'et ikke må overskrives, hvis det allerede indeholder nogle tabeller.
Avatar billede hald. Nybegynder
12. oktober 2004 - 13:02 #4
Hvis jeg stikker dig en af de grønne - kunne det så (rent hypotetisk) tænkes at du kunne prøve at korrigere metoderne så de i stedet returnere enkelte dataset's,...og virker ;-)
Avatar billede arne_v Ekspert
12. oktober 2004 - 13:06 #5
jeg har hverken tid eller mulighed lige nu - måske imorgen
Avatar billede hald. Nybegynder
12. oktober 2004 - 13:12 #6
det er helt ok Arne,...prøver at arbejde lidt videre på det. Men hvis jeg skulle lave det på den måde du forslår, ville jeg så ikke skulle oprette et objekt i de enkelte lag, og så "kopiere" DataSet'et fra det præsentationslaget over i det DataSet der oprettes i Business laget, og så endelig kopiere dette over i det der oprettes i Data Access laget...???
Avatar billede Syska Mester
12. oktober 2004 - 15:48 #7
lytter da lige med her
Avatar billede hald. Nybegynder
13. oktober 2004 - 00:31 #8
Hej Buzz og Arne !

Nu har jeg fået det til at virke - dog ikke på den mest optimale måde. Til at starte med prøvede jeg endnu engang med de almindelige returværdier, hvilket bare medførte at mit dataset blev overskrevet for hver gang jeg kaldte en ny metode, der skulle tilføje en ny tabel til dataset'et.

Jeg kom ud over det (er dog ikke på nogen måde tilfreds med løsningen) ved at sætte mit dataset lig returværdien af metode-kaldet, OG samtidig parameter-overføre skidtet (aka DataSet'et).

Det MÅ da kunne gøres pænere, ka' det ikke ?

// Når vi kalder getListOfAdmintypes(), henter vi BÅDE tabllen admintype og
// administrator fra databasen, og opretter to tilsvarende tabeller i vores
// DataSet, oDataSet, samt en relation imellem dem.
// Grunden til at vi også parameteroverfører DataSet'et, skyldes at vi ellers
// ville overskrive eventuelle, allerede eksisterende tabeller i DataSet'et.

BLAdmintype oBLAdmintype = new BLAdmintype();
oDataSet = oBLAdmintype.getListOfAdmintypes(oDataSet);

// TEST ELEMENTER (dd* er begge dropdowns):
// Til at teste om DataSet'et overskrives
// ---------------

ddAdministrators.DataSource = oDataSet.Tables["administrator"];
ddAdministrators.DataBind();

ddAdmintypes.DataSource = oDataSet.Tables["admintype"];
ddAdmintypes.DataBind();
// ---------------


Buzz -> hvis det er fordi du døjer med et lignende problem, må du jo lige til hvis du skal bruge lidt mere kode.
Avatar billede hald. Nybegynder
13. oktober 2004 - 00:34 #9
Jeg er dog lidt i tvivl om hvordan jeg får opdateret min datasource, da mine DataAdaptere jo ligger nede i mit Data Access Lag i min getListOfAdmintypes()-metode. For bliver de adaptere, som jeg nu engang få oprettet ved mine metodekald, ikke slettet når metoden har returneret selve returværdien ???
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester