0

私はc#とasp.netにまったく慣れていないので、私の質問について少し情報を提供できるかどうか教えてください。

ユーザーがログインしているときに、User オブジェクトのインスタンスを作成し、getcategories メソッドを呼び出して、ユーザーを別のページにリダイレクトします。このような:

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

問題は、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生することです。(User クラスの for ループで最初に発生すること)。私はなぜなのか理解していない :(

User クラスは次のようになります。

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

    } 
}

getcategories() が使用している anvcateg クラスは次のようになります。

public class anvcateg
{
    public string ID;
    public string Name;
    public string Description;
    public string Author;
4

3 に答える 3

1

配列にはすべてヌルが含まれています - オブジェクトを作成していません。空の配列を作成しました。簡単な修正は次のとおりです。

kategorier[i] = new anvcateg();

各反復の開始時。

参考までに、現在のコードは危険 (SQL インジェクション) であり、それ自体はクリーンアップされず、不必要に複雑です。これは「dapper」によるものと同じです:

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

(または、必要に応じて ToArray() )

これにより、すべてのマッピングが内部的に行われ、接続がクリーンアップされ、「id」が安全にパラメータ化されてインジェクション攻撃が回避されます。また、DataTable は表示されません。

于 2012-04-08T17:48:33.380 に答える