2012-04-08 5 views
0

C# 및 asp.net에 새로운 내용이 있으므로 PLZ에서 내 질문에 대한 정보를 알려주십시오.개체 참조가 개체의 인스턴스로 설정되지 않은 이유를 알아낼 수 없습니다.

사용자가 로그인 할 때 내 getcategories 메서드를 호출하고 사용자를 다른 페이지로 리디렉션 한 다음 내 User 개체의 인스턴스를 만듭니다. 이처럼 :

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"); 
} 

문제는 내가 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다"GET "kategorier [I] .NAME = dt.Rows [I] ["이름 "]에 -error이다 .ToString(); " (User 클래스의 for 루프에서 가장 먼저 발생하는 것). 이해가되지 않는 이유 :(

이 사용자 클래스처럼 보이는 방법입니다

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

중복 가능성을 anvcateg의 인스턴스를 생성해야 [.NET에서 NullReferenceException이란 무엇입니까?] (http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) –

+0

adp.Fill (dt) 다음에 DT가 무엇이고 얼마나 많은 행을 가지고 있는지 알려주십시오 –

+0

그리고 그렇지 않습니다. 연결을 올바르게 처리하지 마십시오. –

답변

2

kategorier 당신은 여기에 배열 초기화 anvcateg

의 배열입니다 :

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

을하지만 당신은) 배열에 추가

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

고마워요! 왜 지금 이해 : :) – tobbe

+0

@tobbe - 문제 없습니다. 위의 내용은 게시 한 문제에만 해당됩니다. db 자원 사용 및 주입 보호 정리에 대한 다른 사람들의 조언을 따르십시오. – EdSF

0

귀하의 질문은 다음과 같은 모양을 사용하고 getcategories()

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(); 

    } 
} 

anvcateg 클래스 명확하지 않은 코드 "kategorier [i] .Name = dt.Rows [i] ["Name "]. ToString();"을 찾지 못했습니다.이 행을 포함하는 코드를 게시 할 수 있다면 그러면 대답하기가 쉽습니다.

어쨌든,이 오류의 다음과 같은 이유가있을 수 있습니다 :

  1. 어느 dt.Rows [I] [ "이름"] null로, 당신은()로 .toString를 사용하여 문자열로 변환하기 위해 노력하고있다,

  2. "kategorier"를 배열로 정의했는지 확인하거나 kategorier = new List kategoriers();를 사용할 수 있는지 확인하십시오.

그렇지 않으면 코드가 잘 보이는

1

귀하의 배열은 모두 널 (null)을 포함 - 당신은 어떤 개체를 만들지 않았습니다. 빈 배열을 만들었습니다. 빠른 수정은 다음과 같습니다.

kategorier[i] = new anvcateg(); 

각 반복의 시작 부분에.

정보를 얻으려면 현재 코드가 위험하며 (SQL 주입) 자체적으로 정리하지 않고 불필요하게 복잡합니다. 여기에 "단정"을 통해 동일합니다 :

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

(또는 ToArray() 당신이 원하는 경우)

이 내부적으로 모든 매핑 연결을 정리하고, 안전하게 "ID"피 주입 공격을 parameterises 않습니다 . 그리고 DataTable은 볼 수 없습니다.

+0

하지만 마지막 부분을 이해하지 못하기 때문에 C#에 매우 익숙합니다. P (사이트가 온라인 tho가 아니므로 문제가되지 않습니다. 학습을위한 것임) 첫 번째 부분은 내 문제를 해결했습니다! 감사! – tobbe

+0

@tobbe 학습을위한 것이라면, 배울 점은 SQL injection입니다. 귀하의 코드는 현재 취약합니다. 이것은 나쁜 것입니다. "사용"도 중요합니다. "대담한"여기 당신에게 몇 가지 코드를 저장하는 제안입니다 –

+0

네, 최대한 빨리 배우려고 노력할 것입니다. 내 과정은 아직이 문제를 해결하지 못했지만 교사가 결국 그렇게 할 것이라고 확신합니다. 우리는 처음부터 배우기에 더 많은 것을 배웠습니다 :) – tobbe

관련 문제