Avatar billede simsen Mester
10. december 2006 - 14:11 Der er 16 kommentarer og
1 løsning

Object reference not set to an instance of an object

Hej

Jeg får følgende fejl, når jeg forsøge at selecte fra en access database. Jeg kan slet og ret ikke se, hvor fejlen ligger - nogen af jer, der kan hjælpe?

Min aspx.cs side:

protected void btnLogin_Click(object sender, EventArgs e)
    {
        string brugernavn = txtBrugernavn.Text;
        string adgangskode = txtAdgangskode.Text;

        eksempler.GetUser(brugernavn, adgangskode);
    }

Min Eksempler.cs side:

public class Eksempler
{
    dbConnection connection = new dbConnection();
    public OleDbCommand command = null;

    public Eksempler()
    {
        command = connection.commandVis;
    }

    //Henter bruger fra tabellen
    public DataTable GetUser(string Brugernavn, string Adgangskode)
    {
        //sætter datarow til nul
        DataRow row = null;

        //opretter en instans af Datatable
        DataTable myDataTable = new DataTable();

        //Tilføjer colonner, der svarer til tabel kolonnerne til datatable
        myDataTable.Columns.Add(new DataColumn("BrugerID", Type.GetType("System.String")));
        myDataTable.Columns.Add(new DataColumn("Brugernavn", Type.GetType("System.String")));
        myDataTable.Columns.Add(new DataColumn("Adgangskode", Type.GetType("System.String")));
        myDataTable.Columns.Add(new DataColumn("Sider", Type.GetType("System.String")));

        //Hvilken select jeg arbejder med
        command.CommandText = "SELECT BrugerID, Brugernavn, Adgangskode, Sider FROM Bruger WHERE Brugernavn = @Brugernavn AND Adgangskode = @Adgangskode";

        command.Parameters.Clear();
        command.Parameters.AddWithValue("@Brugernavn", Brugernavn);
        command.Parameters.AddWithValue("@Adgangskode", Adgangskode);

        OleDbDataReader myReader = command.ExecuteReader();

        //går gennem tabellen og lægger ind i rækker
        while (myReader.Read())
        {
            row = myDataTable.NewRow();

            try
            {
                row["BrugerID"] = (myReader["BrugerID"]);
                row["Brugernavn"] = (myReader["Brugernavn"]);
                row["Adgangskode"] = (myReader["Adgangskode"]);
                row["Sider"] = (myReader["Sider"]);
            }
            catch
            { }

            //Tilføjer rækken til datatable
            myDataTable.Rows.Add(row);
        }

        myReader.Close();

        return myDataTable;
    }
}

Til slut min forbindelses side:

private OleDbConnection connectionVis = null;
    public OleDbCommand commandVis = null;
    public string connectionStringVis = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\Inetpub\\wwwroot\\Anja3\\Databaser\\blomst.mdb;";

public void dbConnectionVis()
    {
        connectionVis = new OleDbConnection(connectionStringVis);
        commandVis = new OleDbCommand();
        commandVis.Connection = connectionVis;
        connectionVis.Open();
    }

    public void closeConnectionVis()
    {
        connectionVis.Close();
    }

    public void openConnectionVis()
    {
        connectionVis.Open();
    }

mvh
simsen :-)
Avatar billede thesurfer Nybegynder
10. december 2006 - 14:38 #1
Hvilken linie er der fejl i?

Fejlen betyder, at du ikke har instantieret den..

Eksempel på fejl:

ArrayList a; // denne er defineret, men IKKE instantieret!

Eksempel uden fejl:

ArrayList a = new ArrayList(); // denne er defineret OG instantieret!
Avatar billede simsen Mester
10. december 2006 - 14:39 #2
Den fejler i denne linie her:

command.CommandText = "SELECT BrugerID, Brugernavn, Adgangskode, Sider FROM Bruger WHERE Brugernavn = @Brugernavn AND Adgangskode = @Adgangskode";
Avatar billede thesurfer Nybegynder
10. december 2006 - 14:39 #3
Hvis fejlen er i denne linie:        DataRow row = null;

Skal det være:

        //sætter datarow til nul
        DataRow row = new DataRow;
        row = null;
Avatar billede thesurfer Nybegynder
10. december 2006 - 14:41 #4
Så tror jeg at fejlen er her:

    public OleDbCommand command = null;

Det skal nok være:

    public OleDbCommand command = new OleDbCommand();

Muligvis uden "()"..
Avatar billede simsen Mester
10. december 2006 - 14:47 #5
Det troede jeg også - så den havde jeg forsøgt mig med. Men desværre ikke den der gør det - den fejler stadig samme sted.

Jeg har også forsøgt om det var noget med min select - så har kopieret felterne direkte ind fra databasen, for at sikre mig, der ikke var stavefejl.
Avatar billede thesurfer Nybegynder
10. december 2006 - 14:49 #6
Bliver "command" overhovedet sat til noget, før linien?:

command.CommandText = "SELECT BrugerID, Brugernavn, Adgangskode, Sider FROM Bruger WHERE Brugernavn = @Brugernavn AND Adgangskode = @Adgangskode";
Avatar billede simsen Mester
10. december 2006 - 14:51 #7
Ja det gør den i constructeren:

public Eksempler()
    {
        command = connection.commandVis;
    }
Avatar billede thesurfer Nybegynder
10. december 2006 - 14:53 #8
Prøv med:

public Eksempler()
    {
        this.command = connection.commandVis;
    }
Avatar billede simsen Mester
10. december 2006 - 14:57 #9
stadig samme fejl :-(
Avatar billede thesurfer Nybegynder
10. december 2006 - 15:00 #10
Hvordan ser din Eksempler-klasse ud nu?
Avatar billede simsen Mester
10. december 2006 - 15:01 #11
public class Eksempler
{
    dbConnection connection = new dbConnection();
    //public OleDbCommand command = null;
    public OleDbCommand command = new OleDbCommand();

    public Eksempler()
    {
        //command = connection.commandVis;
        this.command = connection.commandVis;
    }

    //Henter bruger fra tabellen
    public DataTable GetUser(string Brugernavn, string Adgangskode)
    {
        //sætter datarow til nul
        DataRow row = null;

        //opretter en instans af Datatable
        DataTable myDataTable = new DataTable();

        //Tilføjer colonner, der svarer til tabel kolonnerne til datatable
        myDataTable.Columns.Add(new DataColumn("BrugerID", Type.GetType("System.String")));
        myDataTable.Columns.Add(new DataColumn("Brugernavn", Type.GetType("System.String")));
        myDataTable.Columns.Add(new DataColumn("Adgangskode", Type.GetType("System.String")));
        myDataTable.Columns.Add(new DataColumn("Sider", Type.GetType("System.String")));

        //Hvilken select jeg arbejder med
        command.CommandText = "SELECT BrugerID, Brugernavn, Adgangskode, Sider FROM Bruger WHERE Brugernavn = @Brugernavn AND Adgangskode = @Adgangskode";

        command.Parameters.Clear();
        command.Parameters.AddWithValue("@Brugernavn", Brugernavn);
        command.Parameters.AddWithValue("@Adgangskode", Adgangskode);

        OleDbDataReader myReader = command.ExecuteReader();

        //går gennem tabellen og lægger ind i rækker
        while (myReader.Read())
        {
            row = myDataTable.NewRow();

            try
            {
                row["BrugerID"] = (myReader["BrugerID"]);
                row["Brugernavn"] = (myReader["Brugernavn"]);
                row["Adgangskode"] = (myReader["Adgangskode"]);
                row["Sider"] = (myReader["Sider"]);
            }
            catch
            { }

            //Tilføjer rækken til datatable
            myDataTable.Rows.Add(row);
        }

        myReader.Close();

        return myDataTable;
    }
}
Avatar billede thesurfer Nybegynder
10. december 2006 - 15:03 #12
Man skal vel ikke kunne tilgå "command" fra andre steder end selve klasse, skal man?

Hvis ikke, skal det bare være "private" i stedet for "public":

private OleDbCommand command = new OleDbCommand();
Avatar billede thesurfer Nybegynder
10. december 2006 - 15:04 #13
Prøv at sætte et breakpoint på linien

command.CommandText = "SELECT BrugerID, Brugernavn, Adgangskode, Sider FROM Bruger WHERE Brugernavn = @Brugernavn AND Adgangskode = @Adgangskode";

og se hvad "command" er, lige før den crasher, eller lige når den crasher..
Avatar billede simsen Mester
10. december 2006 - 15:30 #14
Den er null

Har fundet ud af hvor problemet lå - det var i constructeren... Jeg kalder den men instansierer den ikke.

Korrekt måde:

public Eksempler()
    {
        connection.dbConnectionVis();
        this.command = connection.commandVis; 
    }

Smid et svar thesurfer - dig der ledte mig ind på, hvor problemet lå og tak :-)

mvh
simsen :-)
Avatar billede thesurfer Nybegynder
10. december 2006 - 15:31 #15
Ok :-)
Avatar billede kalp Novice
10. december 2006 - 15:31 #16
public void dbConnectionVis()
    {
        connectionVis = new OleDbConnection(connectionStringVis);
        connectionVis.Open();
        commandVis = new OleDbCommand();
        commandVis.Connection = connectionVis;
    }
Avatar billede kalp Novice
10. december 2006 - 15:34 #17
okay det blev løst=)

du må gerne lige teste om mit bud også virker... jeg flytter bare på hvornår du åbner din connection
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