2012-04-08 11 views
0

ich ziemlich neu zu C# und asp.net so plz sagen Sie mir, wenn ich Ihnen wenig Info für meine Frage geben.Objektreferenz nicht auf eine Instanz eines Objekts festgelegt, kann nicht herausfinden, warum

Wenn sich ein Benutzer anmeldet, erstelle ich eine Instanz meines User-Objekts und rufe meine getcategories-Methode und den Redirect-Benutzer auf eine andere Seite auf. Wie folgt aus:

if (dt.Rows.Count > 0){ 

    user apa = new user(); 

    apa.namn = dt.Rows[0]["FirstName"].ToString() + " " + dt.Rows[0]["LastName"].ToString(); 
    apa.mail = dt.Rows[0]["Email"].ToString(); 
    apa.id = dt.Rows[0]["ID"].ToString(); 
    apa.firstname = dt.Rows[0]["FirstName"].ToString(); 
    apa.lastnamn = dt.Rows[0]["LastName"].ToString(); 
    apa.password = dt.Rows[0]["Password"].ToString(); 

    Session["user"] = apa; 
    apa.getcategories(); 

    Response.Redirect("visainlagg.aspx"); 
} 

Das Problem ist, dass ich "Objektverweis nicht auf eine Instanz eines Objekts" -Fehler erhalten auf "Kategorier [i] .Name = dt.Rows [i] [" Name "] .ToString(); (Das erste, was passiert in meiner for-Schleife in der Benutzerklasse). Ich verstehe nicht, warum :(

Dies ist, wie die User-Klasse wie folgt aussieht:

public string namn; 
public string mail; 
public string id; 
public string firstname; 
public string lastname; 
public string password; 
public string constr = "secret"; 

public Post[] poster; 

public anvcateg[] kategorier; 
public int antalKategorier; 


public void getcategories() { 
    SqlConnection conn = new SqlConnection(); 
    conn.ConnectionString = constr; 

    SqlCommand com = new SqlCommand(); 
    com.Connection = conn; 
    com.CommandText = "SELECT * FROM Category WHERE Author= '" + id + "'"; 


    SqlDataAdapter adp = new SqlDataAdapter(); 
    adp.SelectCommand = com; 

    DataTable dt = new DataTable(); 
    adp.Fill(dt); 

    antalKategorier = dt.Rows.Count; 

    kategorier = new anvcateg[dt.Rows.Count]; 

    for (int i = 0; i < dt.Rows.Count; i++) 
    { 
     kategorier[i].Name = dt.Rows[i]["Name"].ToString(); 
     kategorier[i].ID = dt.Rows[i]["ID"].ToString(); 
     kategorier[i].Description = dt.Rows[i]["Description"].ToString(); 
     kategorier[i].Author = dt.Rows[i]["Author"].ToString(); 

    } 
} 

der anvcateg Klasse, die GetCategories() wird wie folgt aussieht mit:

public class anvcateg 
{ 
    public string ID; 
    public string Name; 
    public string Description; 
    public string Author; 
+0

möglich Duplikat hinzufügen von [Was ist eine NullReferenceException in .NET?] (http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) –

+0

nach adp.Fill (dt), sagen Sie uns, was ist DT und wie viele Zeilen hat es –

+0

Und es tut nicht die Verbindung nicht korrekt herstellen –

Antwort

2

Kategorier ist ein Array von anvcateg

Sie das Array hier initialisiert:

kategorier = new anvcateg[dt.Rows.Count]; 

Aber Sie haben eine Instanz von anvcateg zu erstellen, um Ihre Array)

for (int i = 0; i < dt.Rows.Count; i++) 
    { 
     kategorier[i] = new anvcateg() 
      { 
       ID = dt.Rows[i]["ID"].ToString(), 
       Author = dt.Rows[i]["Author"].ToString(), 
       Description = dt.Rows[i]["Description"].ToString(), 
       Name = dt.Rows[i]["Name"].ToString() 
      }; 

    } 
+0

Danke Mann! Ich verstehe warum jetzt :) – tobbe

+0

@tobbe - kein Problem. Das oben genannte ist spezifisch für das Problem, das Sie nur gepostet haben. Befolgen Sie den Rat der anderen, um die Ressourcenbenutzung und den Schutz vor Injektionen zu beheben. – EdSF

0

Ihre Frage ist nicht ganz klar, versuchen Sie den Code zu finden "kategorier [i] .Name = dt.Rows [i] [" Name "]. ToString();" aber konnte nicht gefunden werden. Wenn Sie Ihren Code, der diese Zeilen enthalten kann Dann wäre es einfach, Sie zu beantworten.

Wie auch immer, es kann der folgende Grund dieses Fehlers sein:

  1. Entweder dt.Rows [i] [ „Name“] null ist und Sie versuchen, es in Zeichenfolge zu konvertieren, indem .ToString() verwenden, ändere das in Convert.ToString (dt.Rows [i] ["Name"])

  2. überprüfe, ob du "kategorier" als Array definiert hast oder du kannst die List kategorier = new List kategoriers();

Andernfalls wird Ihr Code sieht gut

1

Ihr Array enthält alle Nullen - Sie keine Objekte erstellt haben. Sie haben ein leeres Array erstellt. Eine schnelle Lösung wäre:

kategorier[i] = new anvcateg(); 

zu Beginn jeder Iteration.

Für Informationen, ist Ihr aktueller Code riskant (SQL-Injektion), nicht nach sich selbst aufräumen und unnötig kompliziert. Hier ist das gleiche über „adrett“:

using(var conn = new SqlConnection(constr)) { 
    conn.Open(); 
    var data = conn.Query<anvcateg>(
     "SELECT * FROM Category WHERE [email protected]", 
     new { id }).ToList(); 
} 

(oder ToArray(), wenn Sie bevorzugen)

Dies macht die ganze Mapping intern, um die Verbindung bereinigt und sicher parametrisiert die „id“ Vermeidung von Injection-Angriffe . Und keine DataTable zu sehen.

+0

danke für den Tipp, aber ich denke, ich bin sehr neu zu C#, weil ich den letzten Teil nicht verstehe: P (die Seite ist nicht online tho, so wird es kein Problem sein, es ist nur zum Lernen) Der erste Teil löste mein Problem obwohl! Vielen Dank! – tobbe

+0

@tobbe, wenn es zum Lernen ist, dann ist das erste, was zu lernen: SQL-Injektion. Ihr Code ist derzeit anfällig. Das ist eine schlechte Sache. Das "Verwenden" ist auch wichtig. "Dapper" hier ist nur ein Vorschlag, um Ihnen etwas Code zu sparen –

+0

ja, ich werde versuchen, so schnell wie möglich zu lernen. Mein Kurs hat das noch nicht aufgenommen, aber ich bin mir sicher, dass der Lehrer das irgendwann tun wird. Wir sind am Anfang, also theres viel mehr zu lernen :) – tobbe

Verwandte Themen