Редактировать, чтобы спасти вас от чтения через весь этот пост tldr: поля объекта не должно быть статическим, если вы не хотите, чтобы все экземпляры этого объекта, чтобы иметь такое же значение для этого поляLooping Создание и добавление новых объектов в ArrayList
Я пытаюсь создать и заполнить объекты ArrayList для Blog. Я знаю общий способ сделать это:
create ArrayList of Blogs
loop (some condition)
create new Blog
add this Blog to AL
Однако, когда я пытаюсь сделать это в цикле while(datareader.read())
, все элементы в ArrayList точно так же блог. В частности, я заканчиваю тем, что ArrayList заполнен несколькими указателями на самый последний объект Blog из таблицы базы данных. Вот мой код:
public static ArrayList AllBlogs()
{
SqlDataReader dr = anonPage.ExecuteReader("SELECT * FROM Kristina_Blogs");
ArrayList allBlogs = new ArrayList();
if (dr.HasRows)
{
while (dr.Read())
{
Blog b = new Blog();
//grab a row from Kristina_Blogs and assign those attributes to b
b.setTitle(dr["title"].ToString());
b.setMessage(dr["message"].ToString());
b.setId(dr["id"]);
allBlogs.Add(b);
}
}
dr.Close();
return allBlogs;
}
Как я уже говорил ранее, результатом этого является ArrayList заполнены указателями на самый последний блог из таблицы Kristina_Blogs. Я предполагаю, что allBlogs ArrayList выглядит как [b, b, b, ... b], и поэтому они ВСЕ обновляются, когда я говорю b.setTitle() и т. Д. Но как это может быть, если я создаю объект NEW Blog в начале каждой итерации?
Вот некоторые дополнительные Информация о том, что вы не должны читать, но это могло бы прояснить некоторую путаницу о структуре задачи:
- Блог объект имеет поля ID, название и сообщение и их соответствующие получатели/сеттеры
- Kristina_Blogs - это таблица, представляющая эти блоги с колонками для идентификатора, заголовка, сообщения
- Предложения включают в себя тег для моего механизма БД, но я не могу найти для него тег: Microsoft Студия управления SQL Server
- Этот код прекрасно работает, когда я использую ArrayList цепочек вместо блогов
Edit: Включая код из блога класса
public class Blog
{
public App myApp;
public static string Title;
public static string Message;
public static int Id;
//constructors
public Blog() { }
public Blog(App App) { this.myApp = App; }
//all getters and setters look like this
public string getTitle() { return Title; }
public void setTitle(string t) { Title = t; }
}
не отвечает на ваш вопрос, но подумайте об использовании списка вместо ArrayList. ArrayList был выбором до дженериков и типизированной коллекции (начиная с .Net 2, если я не ошибаюсь) –
Лучше поделиться своим кодом «Блог». Я думаю, проблема заключается в том, что ваш класс 'Blog' имеет статические переменные-члены. –
Также лучше использовать свойства для установки значений вместо 'setX' и' setY' –