Почему SqlDataReader заполняется только последней записью - PullRequest
1 голос
/ 15 июня 2019

Я изучаю веб-формы asp.net, и у меня возникла проблема.

Вместо того, чтобы предоставить то, что я пробовал, я расскажу вам, что у меня работает, а что я пытаюсь сделать, что не работает! Вот что у меня есть и работает:

SqlConnection sqlConn = new SqlConnection(connstr);

sqlConn.Open();
string sqlComm = "SELECT * FROM bookShop";

SqlCommand comm = new SqlCommand(sqlComm, sqlConn);

SqlDataReader reader = comm.ExecuteReader();

while (reader.Read())

Итак, после этого я просто динамически создаю некоторые элементы div и другие элементы для заполнения моего сайта, и это прекрасно работает, он читает всю базу данных и генерирует все.

Однако, это было в моей функции Page_Load, и теперь я пытаюсь изменить его так, чтобы он стал методом класса данных, который позволит мне просто вызывать метод вместо того, чтобы вводить все это в page_load. Таким образом, идея заключается в том, чтобы вызвать метод, который извлечет все записи из моей базы данных и поместит их в List<T>, из которого я планирую создать необходимые элементы, а затем пользователь должен работать со строкой. После того, как он / она закончит, я буду использовать список для обновления базы данных. Это делается для того, чтобы сделать как можно меньше ссылок на фактическую базу.

Вот что у меня есть в методе:

SqlDataReader reader;


Book temp = new Book();

connection.Open();
SqlCommand loading = new SqlCommand("SELECT * FROM bookShop", connection);
reader = loading.ExecuteReader();
while(reader.Read())
{
    temp.ID = int.Parse(reader[0].ToString());
    temp.bookName = reader[1].ToString();
    temp.bookAuthor = reader[2].ToString();
    temp.bookPrice = float.Parse(reader[3].ToString());
    temp.coverPath = reader[4].ToString();
    books.Add(temp);
}
connection.Close();

books - это список, который я беру в качестве параметра, но по какой-то причине этот код заполняет список только последней записью в моей базе данных, и я не могу понять, почему, поскольку он точно такой же, как указано выше.

Ответы [ 2 ]

2 голосов
/ 15 июня 2019

Вы создаете только один экземпляр книги и постоянно перезаписываете значения. Переместите new, в основном:

while(reader.Read())
{
    Book temp = new Book();
    temp.ID = int.Parse(reader[0].ToString());
    temp.bookName = reader[1].ToString();
    temp.bookAuthor = reader[2].ToString();
    temp.bookPrice = float.Parse(reader[3].ToString());
    temp.coverPath = reader[4].ToString();
    books.Add(temp);
}

В качестве альтернативы: используйте инструмент типа "Dapper" , чтобы упростить жизнь:

var books = connection.Query<Book>("SELECT * FROM bookShop").AsList();

или ...

string isbn = "978-1935182474";
var book = connection.QuerySingleOrDefault<Book>(
    "SELECT * FROM bookShop where isbn=@isbn", new {isbn});
0 голосов
/ 15 июня 2019

Вам нужно создать новый экземпляр класса Book для каждой итерации цикла while, а затем добавить его в список следующим образом:

while(reader.Read())
{
    Book temp = new Book();
    temp.ID = int.Parse(reader[0].ToString());
    temp.bookName = reader[1].ToString();
    temp.bookAuthor = reader[2].ToString();
    temp.bookPrice = float.Parse(reader[3].ToString());
    temp.coverPath = reader[4].ToString();
    books.Add(temp);
}
...