0

我对 c# 和 asp.net 很陌生,所以请告诉我,如果我给你一些关于我的问题的信息。

当用户登录时,我创建我的用户对象的一个​​实例,调用我的 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");
}

问题是我在“kategorier[i].Name = dt.Rows[i]["Name"].ToString();”上得到“对象引用未设置为对象的实例”-错误 (在 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

2

kategoier 是 anvcateg 的数组

您在这里初始化了数组:

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

但是你必须创建一个 anvcateg 的实例才能添加到你的数组中)

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

    } 
于 2012-04-08T17:51:53.750 回答
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”以避免注入攻击。并且看不到数据表。

于 2012-04-08T17:48:33.380 回答
0

你的问题不是很清楚,试着找到代码“kategorier[i].Name = dt.Rows[i]["Name"].ToString();” 但找不到它。如果您可以发布包含这些行的代码,那么很容易回答您。

无论如何,这个错误可能有以下原因:

  1. dt.Rows[i]["Name"] 为 null 并且您尝试使用 .ToString() 将其转换为字符串,将其更改为 Convert.ToString(dt.Rows[i]["Name"])

  2. 检查您是否已将“kategorier”定义为一个数组,或者您可以使用 List kategorier = new List kategoriers();

否则你的代码看起来不错

于 2012-04-08T17:40:33.977 回答