положить значения из внутреннего объединения в объект, который находится в объекте - PullRequest
0 голосов
/ 20 ноября 2011

У меня есть следующая команда sql с внутренним объединением:

SqlCommand cmd = new SqlCommand(@"SELECT c.comment_Id, c.date, c.comment, c.rating, a.registration_Date, a.username, a.email, a.profile_Image FROM News_comments c INNER JOIN News_accounts a ON c.account_Id=a.account_Id WHERE c.news_Id = @news_Id", conn);
cmd.Parameters.Add("news_Id", SqlDbType.Int).Value = news_Id;
conn.Open();

Я хочу поместить значения из a (News_accounts) в объект account , который сам по себе находится в объекте newsComment , который находится в общем Список Список новостейКомментарии . Я делаю это так:

using (SqlDataReader reader = cmd.ExecuteReader()) {                
    while (reader.Read()) {
        Comments newsComment = new Comments();
        newsComment.comment_Id = int.Parse(reader["comment_Id"].ToString());
        newsComment.date = DateTime.Parse(reader["date"].ToString());
        newsComment.comment = reader["comment"].ToString();
        newsComment.rating = int.Parse(reader["rating"].ToString());
        newsComment.account.Registration_Date = DateTime.Parse(reader["registration_Date"].ToString());
        newsComment.account.Username = reader["username"].ToString();
        newsComment.account.Email = reader["email"].ToString();
        newsComment.account.Profile_Image = reader["profile_Image"].ToString();
        newsComments.Add(newsComment);
    }
    return newsComments;
}

В комментариях есть конструктор:

public Comments(int comment_Id, DateTime date, string comment, int rating, Accounts account) {
    this.comment_Id = comment_Id;
    this.date = date;
    this.comment = comment;
    this.rating = rating;
    this.account = account;
}

И Аккаунт, а также:

public Accounts(int account_Id, DateTime registration_Date, string email, string username, string profile_Image, string homepage, string about, bool admin) {
    this.account_Id = account_Id;
    this.registration_Date = registration_Date;
    this.email = email;
    this.profile_Image = profile_Image;
    this.homepage = homepage;
    this.about = about;
    this.admin = admin;
}

Вплоть до тех пор, пока рейтинг не пройдет хорошо и значения не будут помещены в объект newsComment , однако, когда он достигнет значений, которые необходимо поместить в объект account , то есть расположенный в объекте newsComment , он дает исключение NullReferenceException. Я знаю, что это означает, что оно не имеет значения, но я не могу понять, почему оно не имеет значения.

Я посмотрел, проверил мое внутреннее соединение с конструктором запросов SQL Server 2008, и это работает так что это должен быть объект, но я не вижу проблемы.

пожалуйста, помогите мне:)

привет

Ответы [ 2 ]

1 голос
/ 20 ноября 2011

newsComment.account Вы должны инициализировать этот объект перед доступом к его полям, свойствам или методам. Как то так:

newsComment.account = new Account();
newsComment.account.Registration_Date = DateTime.Parse(reader["registration_Date"].ToString());
newsComment.account.Username = reader["username"].ToString();
newsComment.account.Email = reader["email"].ToString();
newsComment.account.Profile_Image = reader["profile_Image"].ToString();

... или вы можете сделать это из конструктора класса Comments, который не принимает аргументов.

В качестве примечания: возможно, вам следует рассмотреть возможность использования ORM, такого как LINQ to SQL или Entity Framework. Это то, что они делают.

1 голос
/ 20 ноября 2011

Вы не создаете экземпляр объекта своей учетной записи, поэтому он является нулевым

...